描述
装饰模式就是给一个对象增加一些新的功能,而且是动态的,要求装饰对象和被装饰对象实现同一个接口,装饰对象持有被装饰对象的实例
和适配器模式中的对象适配相比:
- 相同:都是持有一个类对象;
- 不同:装饰器模式需要装饰对象和被装饰对象实现同一个接口;
适用
需要一个扩展类;
动态的为一个对象增加功能,而且还能动态撤销,(继承不能做到这一点,继承的功能是静态的)
问题
会产生过多相似的对象,不易排错
示例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36
| interface Source { public void name(); }
class Animal implements Source { @Override public void name(){ Test.printMsg("Animal.name"); }; }
class Decorator implements Source { private Source source; public Decorator(Source source){ super(); this.source = source; } @Override public void name(){ Test.printMsg("in Decorator.name"); source.name(); Test.printMsg("out Decorator.name"); } }
public class Test { public static void printMsg(String msg){ System.out.println(msg); } public static void main(String[] args){ Source source = new Animal(); Source obj = new Decorator(source); obj.name(); } }
|