装饰者模式

来源:互联网 发布:mac灰色和银色那个好 编辑:程序博客网 时间:2024/04/30 20:57

装饰者模式,精髓:不使用继承
装饰者,是定制的衣服,装饰和原本的类都继承自同一个基类(所以有相同的接口)
一般来说,继承可以偷懒,但是写着写着就写出翔,代码会慢慢走向越写越死,最后要么继续往死了写
要么来个人重构了。
装饰者模式下,可以把这种行为扩大一下,为多个同类型的类定制装饰,而且不会影响原来的类。
有可能因为时间推移,增加的装饰越来越多,最后管理不过来。
在用的时候,需要注意选择:继承,装饰,改原来的装饰。

在平时的使用中也感觉,大多时候,除非是新做整个模块,很少直接使用继承来解决问题
平时项目中对同一模块修改的人很多,这种时候低耦合就很好用。改出问题也只会停留在有改动的地方,不会因为动了父类引起有继承关系的出现问题。

装饰者模式示意图

装饰者模式适用情况
1,很多情况下需要给某个对象单独添加职责,使用装饰者接口后完成这个特殊的职责,不影响这个类
2,处理可撤销的职责
3,无法生成子类(类在定义时就明确定义为了不可继承的),或者原来的类很复杂,或者更接近第一条,只给一个或为数不多的几个对象添加单独的职责。

如果遇到的问题属于或者接近这三条里的一条
就可以使用装饰者模式,多尝试尝试,熟了之后就能开心的使用了。

具体实现
文字描述:
一个抽象类:Gun,专门用于被继承,本身无法被实例化,虚基类。
实际类 M16,我大M16咩咔咔
AK47,我大AK
这两个类都是无法被继承的,都是实在东西了(不考虑生产批次啊,零件产地啊,仿制之类的)
但是,M16和AK47都能加挂东西。比如瞄准镜,红外装置,消音器(额。AK没见加这个的这个)刺刀。。

加挂了这些额外设备的M16依然是M16,但是它们拥有比单纯M16多的功能,比如,突刺。。。

装饰者实现如下:
一个继承了基类的加装了额外设备的类:ExtraEquipGun,依然是抽象的类,没有具体指明是哪个设备

刺刀装饰类 BayonetGun 继承ExtraEquipGun
且内部有成员
Gun* m_gunEx;

这个类用来装饰M16或者AK47都可以

装饰了之后,M16就即可以射击,又可以突刺了。。
新技能=,,=

不可继承的类
2种实现方式
1, 利用私有化构造函数,这个也是很多时候阻止一个很庞大的类进行构造的做法。
2,类似的做法,不过更优雅。
定义一个类 MyClass,继承用于阻止CMyClass被继承的类CUnInherit。
在CUnInherit中,将CMyClass定义为其友元。且CUnInherit中所有与MyClass中通参数的构造函数为私有。
此时如果有类继承MyClass,则会报错。因为在构造时会调用CUnInherit的私有构造函数。

0 0
原创粉丝点击