码迷,mamicode.com
首页 > 其他好文 > 详细

将计算机思维故事化——之设计模式装饰模式

时间:2016-05-13 00:24:55      阅读:165      评论:0      收藏:0      [点我收藏+]

标签:

“我要买一个装东西的袋子”

——如果需要搬家里的行李,这句话可能会发生在超市里。


那么,上述提到的三个名词——“东西”、“袋子”和“行李”,应该是如下图关系:

 技术分享技术分享

(1)行李,是一样东西

(2)袋子,也是一样东西

(3)袋子,可以装行李

通过以上三句话的关系,可以得出结论:第一,袋子可以装东西,虽然其本身就是一样东西;第二,装了东西的袋子,还是一样东西。所以,可以在行李的基础上,不断地套袋子,且不管加多少层,最后得到的还是一样东西。

 

“袋子是东西,袋子可以装东西,装了东西的袋子仍是东西。”

——这是一句绕口的话。这篇文章所介绍的设计模式,就是在这句话的基础上展开的,叫装饰模式(或“包装器模式”)。

【在软件开发思想中,“行李”和“袋子”是具体的称呼,“东西”是抽象的称呼,它们之间的关系称作“继承”;抽象的名词被称为“父类”,具体的名词被称为“子类”。】

 

一句话解释装饰模式就是——用“东西”装“东西”,装了之后还是“东西”

【“东西”既是“袋子”的父类,也是“行李”的父类,被称为“共同父类”或“基类”。】

 

当我们需要为某部分行李(而不是全部行李)添加某些保护的时候(比如:防震、防水),只需要依次套上袋子(防震袋、防水袋)即可。

【“装饰模式”,动态地给一个对象添加一些额外的功能。当有时候希望给某个对象而不是整个类添加一些功能时,可以考虑装饰模式。需要说明的是,添加装饰的顺序是有关系的。】

 

值得一提的是,其中的“袋子”和“行李”两个部分可以进一步发展成两个分支。“袋子”可以进一步发展成“防震袋”、“防水袋”等若干类型,“行李”可以进一步发展成“甲的行李”、“乙的行李”等若干类型,且两分支互不影响

【装饰类和被装饰类可以独立发展,不会相互耦合。】

 

所以,在日常生活打包过程中,可以寥寥几句话完成对某部分行李的打包,例如:“把甲的行李拿过来,加个防震袋,再加个防水袋”;“把乙的行李拿过来,加个防水袋,再加一个压缩气压袋”

【在各对象彼此不影响的情况下,以动态的、透明公开的方式给某个单独对象添加功能。但需要注意的是:过多层数的装饰是比较复杂的,因此,尽量减少装饰类的数量,以便降低系统的复杂度。


伪代码:

东西 a = new 甲行李();

a = new 防震袋(a);

a = new 防水袋(a);

 

东西 b = new 乙行李();

b = new 防水袋(b);

b = new 压缩气压袋(b);

【以基类类型为参数类型,传入构造函数参数列表】




* 思维碰撞,不要忘了与好友分享!未来将推出“将计算机思维故事化”系列,谢谢大家的关注!*

将计算机思维故事化——之设计模式装饰模式

标签:

原文地址:http://blog.csdn.net/laiyizhou/article/details/51348129

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!