装饰模式

Attach additional responsibilities to an object dynamically. Decorators provide a flexible alternative to subclassing for extending functionality.

装饰模式可以,可以动态地为一个对象(注意是对象,不是类)添加功能,而不是通过继承来扩展整个类。

LCD- 最低共同点

/**
 * Lowest Common Denominator
 */
public interface LCD {
    void doIt();
}

核心被包装类

/**
 * 被包装的核心类实现LCD
 */
public class Core implements LCD {
    @Override
    public void doIt() {
        System.out.println("Core - I am closed for modification.");
    }
}

装饰器基类

/**
 * 抽象装饰器也实现LCD("is a LCD"),并且"has a LCD"
 */
public abstract class AbstractDecorator implements LCD {
    // has a LCD
    private LCD core;

    public AbstractDecorator(LCD inner) {
        core = inner;
    }

    public void doIt() {
        if (core != null) {
            core.doIt();
        }
    }
}

注意装饰器基类不仅是一个LCD,同时拥有一个LCD。

具体装饰器类

public class DecoratorA extends AbstractDecorator {
    public DecoratorA(LCD inner) {
        super(inner);
    }

    public void doIt() {
        super.doIt();
        doA();
    }

    private void doA() {
        System.out.println("A");
    }
}

public class DecoratorB extends AbstractDecorator {
    public DecoratorB(LCD inner) {
        super(inner);
    }

    public void doIt() {
        super.doIt();
        doB();
    }

    private void doB() {
        System.out.println("B");
    }
}

public class DecoratorC extends AbstractDecorator {
    public DecoratorC(LCD inner) {
        super(inner);
    }

    public void doIt() {
        super.doIt();
        doC();
    }

    private void doC() {
        System.out.println("C");
    }
}

执行

public class Test {
    public static void main(String[] args) {
        DecoratorA a = new DecoratorA(new Core());
        a.doIt();
        System.out.println("-----------------------------------");

        DecoratorB b = new DecoratorB(a);
        b.doIt();
        System.out.println("-----------------------------------");

        // 一层一层的包装
        // 不需要去继承Core类,就可以为其添加额外的功能
        DecoratorC c = new DecoratorC(new DecoratorB(new DecoratorA(new Core())));
        c.doIt();
    }
}

类图

decorator.png

参考:

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 1 概述 在一个项目中,你会有非常多的因素考虑不到,特别是业务的变更,不时的冒出一个需求是很正常的情况。有三个继承...
    今晚打肉山阅读 316评论 0 0
  • 设计模式———装饰模式 例子:成绩单报告 在面向对象的设计中,如果超过两层继承,可能就出设计问题了。这是经验总结,...
    书笔年华阅读 420评论 0 0
  • 1. 概述 demo地址,欢迎star 2. 问题 3. 解决方案 装饰器模式: 动态地给一个对象添加一些额外的...
    barry阅读 281评论 0 0
  • Yesterday,I finished the last episode of Friends.Rachel g...
    花盐说阅读 175评论 0 0
  • 前几天遇到了一个由于分类引起的 Bug, 折腾了好久才找到根源点,过程甚是纠结。于是对分类这块有一些想法啦,想想平...
    天空中的球阅读 1,317评论 2 6