参考:
https://design-patterns.readthedocs.io/zh_CN/latest/structural_patterns/decorator.html
https://www.cnblogs.com/java-my-life/archive/2012/04/20/2455726.html
一:基本概念
装饰模式包含如下角色:
- Component: 抽象构件
- ConcreteComponent: 具体构件
- Decorator: 抽象装饰类
- ConcreteDecorator: 具体装饰类
- 与继承关系相比,关联关系的主要优势在于不会破坏类的封装性,而且继承是一种耦合度较大的静态关系,无法在程序运行时动态扩展。在软件开发阶段,关联关系虽然不会比继承关系减少编码量,但是到了软件维护阶段,由于关联关系使系统具有较好的松耦合性,因此使得系统更加容易维护。当然,关联关系的缺点是比继承关系要创建更多的对象。
- 使用装饰模式来实现扩展比继承更加灵活,它以对客户透明的方式动态地给一个对象附加更多的责任。装饰模式可以在不需要创造更多子类的情况下,将对象的功能加以扩展。
代码:
//抽象构件
public interface Component {
void doSomeThing();
}
//具体构件
public class ConcreteComponent implements Component{
@Override
public void doSomeThing() {
}
}
//装饰角色
public class DecorateComponent implements Component{
Component component;
@Override
public void doSomeThing() {
component.doSomeThing();
}
public void setComponent(Component component) {
this.component = component;
}
}
//具体装饰
public class ConcreteDecorator extends DecorateComponent{
@Override
public void doSomeThing() {
super.doSomeThing();
}
}
二:透明性要求
一般来说,在使用的时候要申明Component类型的变量,这个透明性的要求
如果是半透明的话:
客户端可以声明ConcreteDecorator类型的变量,从而可以调用ConcreteDecorator类中才有的方法:
半透明用的比较多
三:在Java IO库中的使用
Java Io库就是装饰者模式的具体使用的一个例子
1.抽象构件 最顶层有一个抽象类InputStream ,
就是我们的Component抽象构件
2.具体构件 而ConcreteComponent 则包括 ByteArrayInputSteam ,FileInputSteam ,ObjectInputStream ,PipedInputStream,StringBufferInputStream
3.抽象装饰类 Decorator 在这里则是FilterInputStream
4.具体装饰类 包括BufferedInputStream,DataInputSteam,PushbackInputSteam等等