装饰模式Decorator在iOS中的理解

装饰模式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:装饰器和被装饰对象都需实现同一个函数(接口)

以上是本人的理解,如果有不对的地方,欢迎指导交流。

你可能感兴趣的:(装饰模式Decorator在iOS中的理解)