Java实现装饰者模式

Posted lypzz.com

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java实现装饰者模式相关的知识,希望对你有一定的参考价值。

装饰者模式(Decorator或Wrapper)
被装饰者将扩展功能的任务委托给装饰者,从而避免直接修改原来的类(开闭原则:对扩展开放,对修改关闭)
装饰者与被装饰者拥有同样的超类型
装饰者可以在被装饰者的行为前或行为后,增加自己的行为

装饰者模式说白了,就是在装饰者类中持有超类对象,增强超类对象的功能,或者进行扩展(虽然极其简单,但是很有用)。

Java io包中的包装流就用到了装饰者模式,用来扩展基础流的功能。

装饰者模式示例:

小白程序员一开始啥都不会

public class Coder
{
    public double getSalary()
    {
        return 0;
    }

    public String getSkill()
    {
        return "啥也不会";
    }
}

私下琢磨了一天后,学会了HelloWorld(增强了超类功能,但没有修改超类中的代码)

public class HelloWorldCoder extends Coder
{
    private Coder coder;

    public HelloWorldCoder(Coder coder)
    {
        this.coder = coder;
    }

    @Override
    public double getSalary()
    {
        return coder.getSalary()+100;
    }

    @Override
    public String getSkill()
    {
        return coder.getSkill()+",会写HelloWorld了";
    }
}

通过阅读《Java从入门到精通》,小白终于精通了Java,顺便学会了CRUD

public class JavaCoder extends Coder
{
    private Coder coder;

    public JavaCoder(Coder coder)
    {
        this.coder = coder;
    }

    @Override
    public double getSalary()
    {
        return coder.getSalary()+1000;
    }

    @Override
    public String getSkill()
    {
        return coder.getSkill()+",精通Java";
    }

    // 扩展功能
    public void curd()
    {
        System.out.println("会写增删改查了");
    }
}

小白还在不停的学习新的技能...

测试

public static void main(String[] args)
{
    Coder coder=new Coder();
    System.out.println(coder.getSalary());
    System.out.println(coder.getSkill());

    Coder helloworldCoder=new HelloWorldCoder(coder);
    System.out.println(helloworldCoder.getSalary());
    System.out.println(helloworldCoder.getSkill());

    Coder javaCoder=new JavaCoder(helloworldCoder);
    System.out.println(javaCoder.getSalary());
    System.out.println(javaCoder.getSkill());

    // 使用扩展(装饰类特有)的功能
    JavaCoder crudCoder= (JavaCoder)javaCoder;
    crudCoder.curd();
}

输出

0.0
啥也不会
100.0
啥也不会,会写HelloWorld了
1100.0
啥也不会,会写HelloWorld了,精通Java
会写增删改查了

以上是关于Java实现装饰者模式的主要内容,如果未能解决你的问题,请参考以下文章

Java设计模式之装饰者模式

JAVA设计模式之装饰者模式

java常用设计模式装饰者模式

设计模式之装饰者模式

装饰者模式笔记

Java 代理模式和装饰者模式的区别