装饰者模式
http://lgbolgger.iteye.com/blog/2154368
有时候为了传承某个类的一些功能,我们可以采用继承该类来获取功能,并可以通过覆写某些方法来进行功能加强。然而若想对一批类的功能进行加强,如果仍采用继承,不仅在代码上重复,并且不利于扩展。
public interface Component { public void fun(); } public class ConcreteAComponent implements Component{ @Override public void fun() { System.out.println("ConcreteAComponent"); } } public class ConcreteBComponent implements Component{ @Override public void fun() { System.out.println("ConcreteBComponent"); } }
如果采用继承的话,加强ConcreteAComponent,则需要写一个类继承ConcreteAComponent,加强ConcreteBComponent,则需要写一个类继承ConcreteBComponent,就会造成每当要加强一个类时就必须要新建一个类继承它,在代码上造成严重的重复。
ConcreteTimeDecorator 针对的是接口Component ,不依赖于任何一个具体的Component ,所以每当要增强一个具体的Component时,不用再添加新的类,和继承就不一样了,这样更加容易扩展。
public class ConcreteTimeDecorator implements Component{ private Component component; public ConcreteTimeDecorator(Component component) { super(); this.component = component; } @Override public void fun() { long start=System.currentTimeMillis(); System.out.println("start at "+start); component.fun(); long end=System.currentTimeMillis(); System.out.println("end at "+end+",cost "+(end-start)); } }
public class ConcretePrintDecorator implements Component{ private Component component; public ConcretePrintDecorator(Component component) { super(); this.component = component; } @Override public void fun() { System.out.println("before real component run"); component.fun(); System.out.println("after real component run"); } }
ConcreteAComponent concreteAComponent=new ConcreteAComponent(); ConcreteTimeDecorator concreteTimeDecorator=new ConcreteTimeDecorator(concreteAComponent); concreteTimeDecorator.fun(); System.out.println("--------------------------------------------"); ConcretePrintDecorator concretePrintDecorator=new ConcretePrintDecorator(concreteAComponent); concretePrintDecorator.fun();
装饰器类与Component类紧耦合