您的位置:首页 > 编程语言 > Java开发

【笨鸟先飞】Java重新学习日记16--设计模式之装饰者模式

2018-01-05 16:54 399 查看
设计模式是一套被反复使用、多数人知晓的、经过分类的、代码设计经验的总结。设计模式的某一个模式,是用来解决某一种特定场景。当ABCDE等多个对象,
分别由OPQRST等多个类以不同的数量组合而成的时候,装饰者模式是一个好的选择。

 

装饰者模式的应用场景偏向于狭窄,其优势在于充分的体现了OO设计的特征

 

在《设计模式》一书中,以咖啡为例,不同的咖啡会由不同分量的咖啡豆、糖等构成。

 

同样,比如菜品,每种菜可以由不同的配料组成。

 

再比如,菜单,每一桌客人的点单都由菜单里面的菜组成。

 

正如最初描述的场景,我们需要创建ABCD等无穷多个对象,而确定其由OPQRST等数量也较多的分类构成,如何来完成这个功能。

 

装饰者模式的原理,是创建一个创建对象的时候需要放入一个本身相同类型的对象。即

 

X =new X( Y );   而X和Y是同一个类型(同一个父类)。根据多态,则X和Y的构造器和其父类一样,需要传入一个父类。
这样在X中就包含了Y的信息。

 

同样Y可以包含Z的信息。最终的X对象就包含了XYZ三者的信息。

 

于是,这样可以包含多个子类的信息,完成对象的创建。

 

回到最初的场景,看看是因为什么难题,使我们一步步膜拜装饰者模式的。

 

当ABCDE等多个对象
, 分别由OPQRST等多个类以不同的数量组合而成的时候,

 

背景可以分析出,ABCDE是属于同一个大类的。

 

那么第一个思考就是,ABCDE分别为继承某大类的子类。

ABCDE各为一个类,在类中自然能够定义OPQRST的个数,完美解决问题

 

接下来增加场景的难度,如果abcde的个数不断增加,比如咖啡推出了新咖啡,这个还好,如果是客人点菜,或者是一个人钱包里面的钱数。那么这个组合是随时在变化的。应该怎么办呢?

 

上面的场景,假设了OPQRST的个数不变化,这样还不需要使用完全装饰者模式。

将OPQRST的信息,统一放置到一个集合里面,然后在创建ABCDE的对象的时候,将该集合放进去就可以完成。

 

接下来增加场景的难度,如果不仅abcde的个数不断增加,而且OPQRST的个数也会增加,那么就是使用装饰者模式的好时候。

 

比如A是有OPQ组成,则可以写成

A a = new A(new O( new P( new Q( ))))

 

其中OPQ都是一样的。

里面包含两个构造器。一个的参数为空,另一个则传入OPQ的共同父类。

 

而A类包含一个构造器,传入OPQ的共同父类

 

在使用a对象时,构造器中传入的对象回去调用OPQ的共同父类的方法,而这个调用的实际会遍历调用OPQ三个类里面对应的方法。

 

当有更多的OPQ出现时,只需要编写新的继承至OPQ的共同父类的子类即可。

 

实际应用当中使用到装饰者模式的机会不多,但是其表达出来的OO设计原则值得深思。

 

1: 封装变化

    2:多用组合,少用继承

3:针对接口编程,不正对实现编程

4:尽力解耦

5:开闭原则--对扩展开放,对修改关闭

 

可以感知到,装饰者模式的修改,只修改新增的部分。无论是abcde还是OPQRST。在类写好之后就不用在改了。

 

新增的去继承共同父类,或者在创建对象的时候,变更创建顺序即可。

 

个人觉得装饰者模式是一个使用机会少,但是用来学习OO设计的经典设计模式。

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: