您的位置:首页 > 其它

读《大话设计模式》有感之装饰模式

2013-12-06 12:04 344 查看
读《大话设计模式》有感之装饰模式

  假如说,会有一堆狐朋狗友来家里聚聚,上一桌好菜,必不可少。怎么用程序来实现呢?大家一起动手来试试,要记得要符合开闭原则哦~



图 1



图 2



图 3



图 4



图 5



图 6



图 7

  (图 1)创建table实例,在饭桌上吃饭,然后一步一步创建food的实例,也就是上菜了。如果还需要上什么菜,就只要继承food类,实现serving方法,创建菜的实例,调用serving方法就OK了。这样是没有面向对象编写不规范,或者违背开闭原则的问题了,但是新的问题就又来了。

  看下面这段代码:



图 8

  这段代码就是说,在客人已经上桌的时候,你做的菜是one by one出现的,但是主人的期许是希望客人能够对着一大桌美食狂吃,并赞扬主人手艺好,那么应该怎么用代码实现呢?

  先不要急,笔者为大家介绍一种设计模式——装饰模式。

  装饰模式:动态地给一个对象添加一些额外的职责,就增加功能来说,装饰模式比生成子类更加灵活。

  来看看它的结构图:



图 9

  来看看代码是如何实现的。

  Party类(Component)



图 10

  Table类(ConcreteComponent)



图 11

  Food类(Decorator)



图 12

  具体的Food类(ConcreteDecorator)



图 13



图14



图 15



图 16

  客户端代码实现:



图 17

  装饰模式是为已有功能动态添加更多功能的一种方式。当系统需要新功能的时候,是向旧的类中添加新的代码。这些新加的代码通常装饰了原有类的核心责任或主要行为,但这种做法的问题在于,它们在主类中加入了新的字段,新的方法和新的逻辑,从而增加了主类的复杂度。就像起初的table类,而这些新加入的东西仅仅是为了满足一些只在某种特定情况下才会执行的特殊行为的需要。而装饰模式却提供了一个很好的解决方案,它把每个要装饰的功能放在单独的类中,并让这个类包装它所要装饰的对象,因此,当需要执行特殊行为时,客户代码就可以在运行时根据需要有选择地、按顺序地使用装饰功能包装对象了。

  装饰模式的优点就是:把类中装饰功能从类中搬移去除,这样可以简化原有的类,有效地把类的核心职责和装饰功能区分开来,而且可以去除相关类中重复的装饰逻辑。

  部分语句摘自《大话设计模式》,谢谢~
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: