一.小结
- 定义:动态地给一个对象添加一些额外的功能。就增加功能来说,装饰器模式相比生成子类更为灵活。
- 优点:1.装饰类和被装饰类可以独立发展,不会相互耦合。2.是继承的一个代替的方式。2.可以动态扩展一个实现类的功能。
- 缺点:多层装饰比较复杂。
- 通用UML图:
二.例子
在早前科技还不发达的日子,在QQ上装饰自己勾搭陌生人的时光真的很让人怀念,像《第一次的亲密的接触》中所描述的青春与美好。但现在的网络中充满了太多不好的因素,让人谨慎,希望大家能够"让上帝的归上帝,恺撒的归恺撒,网络的归网络,现实的归现实"!下面模拟这个情景。
-
定义原始构件
public interface IBoy { void chat(); }
-
具体原始构件(现实中文静的小男孩)
public class RealBoy implements IBoy { @Override public void chat() { System.out.println("陌生人,你好!"); System.out.println("我是GG,15岁"); } }
-
定义装饰器
public abstract class BoyDecorator implements IBoy { private IBoy boy; public BoyDecorator(IBoy boy) { this.boy = boy; } @Override public void chat() { this.boy.chat(); } }
-
装饰后的构件(网络的外向活泼的男孩)
public class InternetBoy extends BoyDecorator { public InternetBoy(IBoy boy) { super(boy); } @Override public void chat() { super.chat(); fake(); } private void fake() { // 下面是一些装饰自己的东西: // 比如更换女生头像 // System.out.println("换一个小清新的MM头像"); // 现实中文静的人,网络中也可以表现的很外向 System.out.println("我是一个活泼外向的小男孩"); } }
-
情景类 (与陌生人聊天)
public class Client { public static void main(String[] args) { // 现实中文静的男孩 RealBoy realBoy = new RealBoy(); // 网络的外向活泼的男孩 InternetBoy internetBoy = new InternetBoy(realBoy); realBoy.chat(); internetBoy.chat(); } }