Java实现装饰者模式

时间:2021-07-02 15:44:32   收藏:0   阅读:0

装饰者模式(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
会写增删改查了
评论(0
© 2014 mamicode.com 版权所有 京ICP备13008772号-2  联系我们:gaon5@hotmail.com
迷上了代码!