装饰(decorator)
强调增强功能;
运行时动态组合(装饰类之间的嵌套调用方式)增强、新增行为。eg:某对象有9项行为,某一个功能一需要使用前6(1-6)项行为,某一个功能二需要使用后6(4-9)项行为。针对此应用场景可以设计基类实现4-6项行为,装饰1类实现1-3项行为,装饰2类实现7-9项行为,功能一使用装饰1类装饰基类实现,功能二使用装饰2类装饰基类实现
io对象间就是很好的装饰模式应用:BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(new FileReader("")));这段代码很好的体现了装饰模式可以让使用者直观的看到增强了哪些功能
装饰模式通常的做法是将原始对象作为一个参数传给装饰者的构造器
装饰模式嵌套调用的
装饰模式以对客户端透明的方式扩展对象的功能,是继承关系的一个替代方案
装饰模式可以理解为动态继承
代理(proxy)
强调限制功能;
隐藏真实类、控制访问(换句话说,可以不执行某功能)。代理模式的时候,我们常常在一个代理类中创建一个真实对象的实例达到隐藏目的,由代理对象来控制对真实对象的引用
代理模式不是嵌套调用的
类继承
编译时增强功能
子类过多时,可以向上总结抽取利用装饰模式实现动态继承,eg:
Reader(基类)(继承图)
|-- FileReader
|-- FileBufferedReader
|-- StringReader
|-- StringBufferedReader
|-- PipedReader
|-- PipedBufferedReader
使用装饰模式重构:
Reader
|-- FileReader
|-- StringReader
|-- PipedReader
|-- BufferedReader