程序设计时,有一条重要的准则,就是合成/聚合复用,根据该原则的思想,代码复用应该尽可能使用委托,而少用继承.继承是一种紧密耦合的的类关系.任何父类的改动都会影响其子类,因而不利于系统维护.而委托是一种松散耦合,只要接口不变,委托类的改动,并不会改动其上层对象.
装饰着模式就充分利用了这一点,通过委托机制,复用系统的各个组件,可以将这些组建任意组合成所需的对象,而各个子功能模块被维护在相关的各个类中.
装饰者模式的基本结构如图:
装饰者(decorator)和被装饰者(concreteCompnen)实现了共同的接口(component),被装饰者是核心组件,而装饰者则在被装饰者前后加上相应的处理,增强被装饰者的功能.
比如,我有一个打印的方法,现在想在原来的内容上加上一个前置内容,如题代码设计如下.
首先,设计的接口 IPrint:
package com.tzl.model.decorator;
public interface IPrint {
public String print();
}
然后,是原有的打印程序:
package com.tzl.model.decorator;
public class PrintImpl implements IPrint {
@Override
public String print() {
// TODO Auto-generated method stub
System.out.println("我是原有的内容");
return "我是原有的内容";
}
}
设计的抽象类PrintAbstract用来维护原有组件,并告子其子类,其核心业务应全委托给PrintImpl,代码实现:
package com.tzl.model.decorator;
public abstract class PrintAbstract implements IPrint{
IPrint iPrint;
public PrintAbstract(IPrint iPrint){
this.iPrint=iPrint;
}
}
最后,是 具体装饰器DecoratorPrint:
package com.tzl.model.decorator;
public class DecoratorPrint extends PrintAbstract{
public DecoratorPrint(IPrint iPrint){
super(iPrint);
}
@Override
public String print() {
// TODO Auto-generated method stub
System.out.println("代理完成");
System.out.println("我是被加的内容"+iPrint.print());
return "我是被加的内容"+iPrint.print();
}
}
测试代码如下:
package com.tzl.model.decorator;
public class TestDecorator {
public static void main(String[] args) {
PrintImpl printImpl=new PrintImpl();
IPrint print=new DecoratorPrint(printImpl);
print.print();
}
}
打印结果: