- gof中图形界面的程序举例:字处理软件(word、editplus、notepad……加边框加滚动条加装饰)
- 顾名思义,就是给一个东西加一点装饰(给坦克加装饰:加外壳、加血条、加尾巴;给子弹加装饰:加外壳、加尾巴)
- 最直观的解决方案是用继承(有血条的坦克、有尾巴的坦克、有尾巴有血条的坦克……),但是这样不方便(一是会产生类爆炸;二是父类变了子类也得跟着变;装饰和被装饰者之间耦合度太高)
- 还能想到代理模式(设计模式会混到一起,好几种都可以,从开始会刻意去区分到最后信手拈来)
- 装饰器模式的核心思想是用聚合来代替继承,并且聚合应该聚合的是GameObject,而不是tank对象(聚合tank对象耦合度依旧太高了,想给子弹加装饰仍然困难)
- 桥梁模式和装饰器模式很类似,只是语义上不同,语法上很类似
- 桥梁模式是两个分支独立的发展
- 装饰器模式强调的是装饰,是语义上的
- 很多模式不是在语法上区别,而是在语义上区别,意思是什么,意思是不同的
- 统一语法可以用在桥梁,也可以用在装饰器
- 可以是桥梁,也可以是装饰器
UML类图
- 具体的装饰器之间也可以相互聚合
- 上图中还涉及到**责任链模式?**:想给子弹做两个装饰,可以先将子弹聚合到RectDecorator中去,再将RecDecorator聚合到TailDecorator中去
坦克装饰解决方案
Tank
TankDecorator
tank
paint()--->tank.paint()+装饰
聚合tank--->聚合GameObject类型(这样不只能装饰tank,还能装饰别的)
装饰器模式在jdk中的典型应用:IO包
package com.mashibing.dp.decorator;
import java.io.*;
public class Main {
public static void main(String[] args) throws Exception {
File f = new File("c:/work/test.data");
FileOutputStream fos = new FileOutputStream(f);
OutputStreamWriter osw = new OutputStreamWriter(fos);
BufferedWriter bw = new BufferedWriter(osw);
bw.write("http://www.mashibing.com");
bw.flush();
bw.close();
}
}
🤏随想
- 装饰器模式与代理模式非常像!