定义
如果大量使用继承结构,就会造成系统中的类“爆炸式”的增多,而且当修改继承树上不同的分支做修改,代码可能重复。
装饰模式使用组合和委托而不是继承解决功能变化的问题。装饰模式可以建立管道式的结构对于创建过滤器很有用。
代码示例
1 | // 区域 |
代码解读:
Plains是本体类,DiamondDecorator和PollutionDecorator是装饰类,可以将本体类作为实例通过构造函数注入到装饰类。
在装饰类内部通过委托的形式可以获取当前的收益系数。同时由于都继承自同一个基类,所以可以继续传递下去。
在这个游戏中,当玩家占领一个草地区域时,可以获取相应收益。而草地或者其他区域可能包含钻石,也可能被污染了,
这样就可以使用装饰模式了,装饰模式并不影响原有的核心功能,但却增加了修饰的功能,方便扩展。
总结
为什么要使用装饰模式?这是因为在一个继承结构的体系中,子类通常是互斥的,比如一辆车,品牌只能要么是奥迪、要么是宝马,不可能同时属于奥迪和宝马。
但是更换内饰的功能却是互相可以兼容的。