装饰模式动态的给一个对象添加一些额外的职责,就增加功能来说,装饰模式比生成子类更灵活。其适用性体现在不影响其他对象的情况下,以动态、透明的方式给单个对象添加职责。语出自Gof《设计模式》。
《大话设计模式》里讲到装饰模式的方法就是非常简单的对一个人进行装饰——穿衣服,那就可以把具体的人理解为一个对象,衣服,鞋子,太阳镜等都是装饰物,如果不考虑身材和衣物的大小的话,其实衣服可以随便穿,顺序无所谓,只要你敢穿,这就是装饰模式的精髓。但实际情况中,顺序很重要,所以在应用装饰模式时一定要注意顺序,或者把相关的子类的设置做成完全无关,以免弄乱顺序导致系统出错。在Gof的《设计模式》里讲到用装饰模式去装饰一个用户界面,添加滚动条,边框之类的东西。要注意的是,装饰后的对象已经不是从前的那个对象了。
在古剑里,装饰模式应该可以应用到主角装备的更换中,那是个典型的穿衣服问题。另外我在想,是不是可以应用到战斗中的选招数中呢?因为古剑战斗一次可以发组合技能的,也就是说,可以用几个低行动点数的招数组合起来攻击敌人,我觉得这就是一个装饰模式。事先根本不知道要选择什么招数,也不知道先用哪一招,而且在确定攻击前,这些选择的招数可以撤销。而且招数的组合基本上就是爆炸式的,这些条件非常符合Gof提出的装饰模式的适用性。只不过此处的装饰模式是受到行动点数的限制的,不可以无限制装饰下去。当然,这只是我现在比较简单的看法,如果以后在别的设计模式的学习过程中发现其实别的设计模式解决这个问题更好,我不介意完全推翻现在的想法。
好,以下是代码实现。具体在实际情况中,有些类是可以合并的,我这里实现的是根据UML图画出来的比较标准的情况。
component.h 文件
concreteComponent.h 文件
concreteComponent.cpp 文件
decorator.h 文件
decorator.cpp 文件
concreteDecoratorA.h 文件
concreteDecoratorA.cpp 文件
concreteDecoratorB.h 文件
concreteDecoratorB.cpp 文件
main.cpp 文件
运行结果
每天都搞到这个时候……唉……算了,为了能去烛龙,忍了~
不过貌似我都没有写注释啊……回头补上……不写注释的程序员可不是什么好程序员……