1. gof中图形界面的程序举例:字处理软件(word、editplus、notepad……加边框加滚动条加装饰)
  2. 顾名思义,就是给一个东西加一点装饰(给坦克加装饰:加外壳、加血条、加尾巴;给子弹加装饰:加外壳、加尾巴)
  3. 最直观的解决方案是用继承(有血条的坦克、有尾巴的坦克、有尾巴有血条的坦克……),但是这样不方便(一是会产生类爆炸;二是父类变了子类也得跟着变;装饰和被装饰者之间耦合度太高)
  4. 还能想到代理模式(设计模式会混到一起,好几种都可以,从开始会刻意去区分到最后信手拈来)
  5. 装饰器模式的核心思想是用聚合来代替继承,并且聚合应该聚合的是GameObject,而不是tank对象(聚合tank对象耦合度依旧太高了,想给子弹加装饰仍然困难)
  6. 桥梁模式和装饰器模式很类似,只是语义上不同,语法上很类似
    1. 桥梁模式是两个分支独立的发展
    2. 装饰器模式强调的是装饰,是语义上的
  7. 很多模式不是在语法上区别,而是在语义上区别,意思是什么,意思是不同的
    1. 统一语法可以用在桥梁,也可以用在装饰器
    2. 可以是桥梁,也可以是装饰器

UML类图

image.png

  • 具体的装饰器之间也可以相互聚合
  • 上图中还涉及到**责任链模式?**:想给子弹做两个装饰,可以先将子弹聚合到RectDecorator中去,再将RecDecorator聚合到TailDecorator中去

坦克装饰解决方案

  1. Tank
  2. TankDecorator
  3. tank
  4. paint()--->tank.paint()+装饰
  5. 聚合tank--->聚合GameObject类型(这样不只能装饰tank,还能装饰别的)

装饰器模式在jdk中的典型应用:IO包

image.png

  1. package com.mashibing.dp.decorator;
  2. import java.io.*;
  3. public class Main {
  4. public static void main(String[] args) throws Exception {
  5. File f = new File("c:/work/test.data");
  6. FileOutputStream fos = new FileOutputStream(f);
  7. OutputStreamWriter osw = new OutputStreamWriter(fos);
  8. BufferedWriter bw = new BufferedWriter(osw);
  9. bw.write("http://www.mashibing.com");
  10. bw.flush();
  11. bw.close();
  12. }
  13. }

🤏随想

  1. 装饰器模式与代理模式非常像!