装饰模式指的是在不必改变原类文件和使用继承的情况下,动态地扩展一个对象的功能。它是通过创建一个包装对象,也就是装饰来包裹真实的对象。(来自百度百科)
假设有汉堡香辣鸡腿堡,黑椒牛柳堡,它仅有两块面包和一块肉,如果想给这个汉堡加料,比如生菜、辣椒、醋。这个时候可以使用装饰模式。
1,定义汉堡接口
pubilc interface Hambergur{ String getName(); abstract double getPrice(); }
2,被装饰者:香辣鸡腿堡
//被装饰者:香辣鸡腿堡 public class 香辣鸡腿堡 implements Hambergur{ public String getName(){ return "香辣鸡腿堡"; } public double getPrice(){ return 12.80; } }
3,被装饰者:黑椒牛柳堡
public class 黑椒牛柳堡 implements Hambergur{ public String getName(){ return "黑椒牛柳堡"; } public double getPrice(){ return 15.80; } }
4,装饰者:加辣椒
public class 加辣椒 implements Hambergur{ private Hambergur hambergur; public 加辣椒(Hambergur hambergur ){ this.hambergur = hambergur; } public String getName(){ return hambergur.getName()+"加辣椒"; } public double getPrice(){ return hambergur.getPrice()+1; } }
5,装饰者:加生菜
public class 加生菜 implements Hambergur{ private Hambergur hambergur; public 加生菜(Hambergur hambergur ){ this.hambergur = hambergur; } public String getName(){ return hambergur.getName()+"加点生菜"; } public double getPrice(){ return hambergur.getPrice()+2; } }
6,主程序:买汉堡
public static void main(String[] args){ Hambergur hambergur = new 加辣椒(new 加生菜(new 香辣鸡腿堡())); //省略控制台输出语句 hambergur.getName(); hambergur.getPrice(); }
7,测试结果
香辣鸡腿堡加生菜加辣椒
15.80
--- 扩展:IO流中的装饰者模式 ---
上面这图来自《head first 设计模式》,最顶层的是InputStream,它是一个抽象类,具有4个实现类,图中标注的FilterInputStream是一个抽象装饰者(其实是一个具体的实现类),最下面四个是它的子类,也就是四个包装类。运用到包装模式,四个包装类可以任意嵌套InputStream的子类,是一个很典型的装饰者模式的应用。
因为I/O使用了装饰者模式,会有一大堆装饰用的小类。最开始学习的时候,会被其中一大堆API吓到,现在了解其工作原理,就可以很清楚的辨别出是如何组织的,使用起来就会得心应手了。