装饰者模式
装饰者模式就是动态的给一个对象额外的添加一些职责或者说方法,接口。
我们还是到实际的应用中来理解这个模式。
前段时候,我们实验室因为在市场上的巨大成功,盈利能力得到了很大的提高,所以老总们就不再共享女秘书了:
class NvMishu { public void fuwu() { System.out.println("服务"); } }
接着又过了一段时间,有位老总不再满足女秘书于女秘书单调的服务,他还要求像水手般的服务。秘书处的人灵机一动,我们不能因为这个就重新招哥秘书,但是我们可以买套水手服让这个秘书穿上啊:
class NvMishu { public void fuwu() { System.out.println("服务"); } } class ShuiShou { private NvMishu nms; public ShuiShou (NvMishu nms) { this.nms = nms; } public void fuwu() { this.nms.fuwu(); } public void shuishoufeeling() { System.out.print("水手Feeling的"); this.nms.fuwu(); } } public class Decorator { public static void main(String[] args) { NvMishu nms = new NvMishu(); ShuiShou ss = new ShuiShou(nms); ss.fuwu(); ss.shuishoufeeling(); } }
其他两个老总一看,这个不错,于是也提出了自己的要求:一个要大学生的感觉,一个要良家的感觉。第一个老总却改变了主意,觉得女秘书不够刺激,想招一个男秘书。秘书处的人一下子头都大了,又是海量的工作阿,于是只能去请教我们的资深顾问林阿标(好吧,上篇因为提到不该提到的文字,只能改个名字了~,再次感谢伟大的自XX由)。
林阿标一听,这个容易阿,你们做衣服的时候别根据女秘书的体型阿,而是根据秘书的体型阿,反正女秘书和男秘书都是秘书嘛,而且衣服也不在乎包裹着的是什么样的身体:
interface Mishu { abstract public void fuwu(); } class NvMishu implements Mishu{ public void fuwu() { System.out.println("女秘书的服务"); } } class NanMishu implements Mishu{ public void fuwu() { System.out.println("男秘书的服务"); } } class ShuiShou { private Mishu ms; public ShuiShou (Mishu ms) { this.ms = ms; } public void fuwu() { this.ms.fuwu(); } public void shuishoufeeling() { System.out.print("水手Feeling的"); this.ms.fuwu(); } } class LiangJia { private Mishu ms; public LiangJia (Mishu ms) { this.ms = ms; } public void fuwu() { this.ms.fuwu(); } public void liangjiafeeling() { System.out.print("良家Feeling的"); this.ms.fuwu(); } } public class Decorator { public static void main(String[] args) { ShuiShou ss = new ShuiShou(new NanMishu()); ss.fuwu(); ss.shuishoufeeling(); Mishu ms = new NvMishu(); LiangJia lj = new LiangJia(ms); lj.fuwu(); lj.liangjiafeeling(); ShuiShou ssA = new ShuiShou(ms); ssA.fuwu(); ssA.shuishoufeeling(); } }
这下老总们满意了,但是秘书们不高兴了,有的时候老总要的急,刚穿上良家装,又得脱下换上水手装,然后又得换回去,这可怎生纠结,于是林阿标顾问又提出了改进意见:不管是穿上“水手”服还是“良家”服的“男秘书”,“女秘书”都还必须是“秘书”。那么只要让“水手”和“良家”实现“秘书”接口,就能直接穿其他的服装而不需要脱了阿:
interface Mishu { abstract public void fuwu(); } class NvMishu implements Mishu{ public void fuwu() { System.out.println("女秘书的服务"); } } class NanMishu implements Mishu{ public void fuwu() { System.out.println("男秘书的服务"); } } class ShuiShou implements Mishu{ private Mishu ms; public ShuiShou (Mishu ms) { this.ms = ms; } public void fuwu() { this.ms.fuwu(); } public void shuishoufeeling() { System.out.print("水手Feeling的"); this.ms.fuwu(); } } class LiangJia implements Mishu{ private Mishu ms; public LiangJia (Mishu ms) { this.ms = ms; } public void fuwu() { this.ms.fuwu(); } public void liangjiafeeling() { System.out.print("良家Feeling的"); this.ms.fuwu(); } } public class Decorator { public static void main(String[] args) { Mishu ms = new NvMishu(); //现在秘书就算套上无数套衣服也能正常工作了 ShuiShou ssA = new ShuiShou(new LiangJia(new ShuiShou(new LiangJia(new ShuiShou(new LiangJia(ms)))))); ssA.fuwu(); ssA.shuishoufeeling(); } }
上面就是完整的装饰者模式的代码,其中男女秘书是被装饰者,而水手和良家是装饰者。
当然在Java中有着更加经典的例子: java.io.*, 有兴趣的可以研究下。