装饰模式(Decorator):动态地给一个对象添加一些额外的职责,就增加功能来说,装饰模式比生成子类更为灵活
类图:
代码:
publicabstractclass Componet {
publicabstractvoid Operation();
}
publicclass ConcreteComponet extends Componet {
@Override
publicvoid Operation(){
System.out.println("特定操作");
}
}
publicabstractclass Decorator extends Componet {
protected Componet componet;
publicvoid setComponet(Componet componet){
this.componet=componet;
}
}
publicclass ConcreteDecoratorA extends Decorator {
@Override
publicvoid Operation() {
if(componet!=null){
System.out.println("记录日记_A");
componet.Operation();
}
}
}
publicclass ConcreteDecoratorB extends Decorator{
@Override
publicvoid Operation() {
if(componet!=null){
System.out.println("读取记录_B");
componet.Operation();
}
}
}
publicstaticvoid main(String[] args) {
//创建装饰者和被被装饰者
Componet base=new ConcreteComponet();
Decorator d1=new ConcreteDecoratorA();
Decorator d2=new ConcreteDecoratorB();
//随意添加装饰
d1.setComponet(base);
d2.setComponet(d1);
d2.Operation();
d2.setComponet(base);
d1.setComponet(d2);
d1.Operation();
}
优点:可以随意更换装饰,扩展性很强。
缺点:必须对外暴露装饰者实现类;装饰职责链过长。
装饰模式用于对于已有功能的扩展比较适合。装饰模式和适配器模式一样,都用于java.io包。如果没有用到装饰模式就不要编写多余的代码,因为装饰模式可以再有需要的时候再添加上去。
| 装饰 | 适配器 |
适用背景 | 在已有功能的基础上扩展功能 | 在已有功能的基础上统一接口 |
使用的接口 | 使用原来接口 | 使用新的接口 |
增加功能 | 增加功能 | 可以修改功能 |
|
|
|