装饰模式Decorator的定义:
动态给一个对象添加一些额外的职责。就增加功能来说,Decorator模式相比生成子类更加灵活。
关系图如下:
1920px-Decorator_UML_class_diagram.svg.png
名词解释:
Component:一个被添加装饰的对象
ConcreteComponent:继承与Component的子类对象
Decorator:装饰器对象,其中Component的子类是其中一个属性
ConcreteDecorator:装饰器的子类对象,可以实现或者添加operation
看定义的话比较抽象,下面直接演示代码。
iOS事例:
假如有一个勇者,勇者的装备只有一把剑,然后我们用装饰器模式给勇者加上其他装备,例如一个盾牌。下面是具体代码。
WeChat7cb898aaaee90bb7af107b165a6c75c0.png 角色代码 勇者的代码 装饰器的代码 盾的代码
其中Component对应Role(角色),ConcreteComponent对应Brave(勇者),Decorator对应Decorator,ConcreteDecorator对应Shiled(盾),operation对应函数equipment
下面是执行顺序与结果:
执行 输出结果
以上就是装饰器模式在iOS的一个小小例子。
思考:
问题:看到以上代码,你肯定会想,iOS里面如果要给一个对象添加额外的功能函数甚至属性,直接用Category或Extension去扩充不就更方便吗?
我的理解:Category和Extension都是Objective-c和Swift特性,其中Category更是Objective-c作为动态语言特有特性,其他静态语言未必具备Category特性。Decorator模式适用与所有语言,不需要依赖语言特性。而Extension是编译时添加扩展,这么看Extension确实实现了装饰模式同样的功能,但按照上面的结构定义,并不属于装饰模式。
总结:
1:装饰模式下,不能对被装饰对象的类作任何修改
2:装饰器和被装饰对象都需实现同一个函数(接口)
以上是本人的理解,如果有不对的地方,欢迎指导交流。
网友评论