【笨鸟先飞】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设计的经典设计模式。
分别由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设计的经典设计模式。
相关文章推荐
- 【笨鸟先飞】Java重新学习日记14--设计模式之策略模式
- 【笨鸟先飞】Java重新学习日记19--设计模式之命令模式
- 【笨鸟先飞】Java重新学习日记20--设计模式之适配器模式
- 【笨鸟先飞】Java重新学习日记21--设计模式之模板模式和状态模式简介
- 【笨鸟先飞】Java重新学习日记15--设计模式之观察者模式
- <JAVA学习笔记二>——设计模式之装饰者设计模式
- 【笨鸟先飞】Java重新学习日记11---创建一个类
- java设计模式之装饰者模式学习
- 学习、探究Java设计模式——装饰者模式
- 【笨鸟先飞】Java重新学习日记6---类的使用(2)
- java 设计模式 学习笔记(16) 单例模式
- 【笨鸟先飞】Java重新学习日记12--创建一个类2
- 2014-07-19 Java Web的学习(16)-----struts2(2)----设计模式--ThreadLocal模式
- 【笨鸟先飞】Java重新学习日记13--创建一个内部类
- 【笨鸟先飞】Java重新学习日记9---异常处理
- 【笨鸟先飞】Java重新学习日记7---高级数组之集合
- 设计模式学习之装饰者模式(Decorator,结构型模式)(16)
- java设计模式学习之装饰者模式
- 【笨鸟先飞】Java重新学习日记5---类的使用
- java/android 设计模式学习笔记(7)---装饰者模式