iOS应用程序的基础框架Cocoa Touch框架内容丰富、结构优美,通过将各种设计模式应用到其基础结构中,为第三方开发者提供了很好的可扩展性和灵活性。因此,要充分利用这一框架,应当深刻理解
并恰当应用设计模式。
抽象集合
组合
把组合想象为一个实体,它包含着同一类型的其他实体。整个结构就像由父节点实体和子节点实体连接而成的树,这种树状结构形成部分-整体
的层次结构
组合模式的静态结构类图如下
将对象组合成树形结构以表示“部分-整体”的层次结构,组合使得用户对单个对象和组合对象的使用具有一致性。
- 在Cocoa Touch框架中使用组合模式
UIView
被组织成一个组合结构,每个UIView的实例可以包含UIView的其他实例,形成统一的树形结构,让客户端对单个UIView对象和UIView的组合统一对待。
总结
组合模式的主要意图是让树形结构中的每个节点具有相同的抽象接口。这样整个结构可作为一个统一的抽象结构使用,而不暴露其内部表示。对每个节点(叶节点或组合体)的任何操作,可以通过协议或抽象基类中定义的相同接口来表示。
迭代器
迭代器提供了一种顺序访问聚合对象(集合)中元素的方法,而无需暴露结构的底层表示和细节。
- Cocoa Touch中使用迭代器模式
基础框架中NSEnumarator类实现了迭代器模式。抽象NSEnumater类的私有具体子类返回枚举器对象,能够顺序遍历各种集合-数组、集、字典,把集合中的对象返回给客户端
总结
迭代器模式与访问者模式有些类似,尤其是把便利算法放到访问者模式中或者在便利聚合体时让内部迭代器对元素执行操作的时候。组合模式常常依靠迭代器来便利其递归结构。
行为扩展
访问者
访问者模式涉及两个关键组件,访问者和它访问的元素。元素可以是任何对象,但通常是“部分-整体”结构中的节点
访问者模式:表示一个作用于某对象结构中各元素的操作,它让我们可以在不改变各元素的类的前提下定义作用于这些元素的新操作
访问者模式时扩展组合结构功能的一种强有力的方式,如果组合结构具有精心设计的基本操作,而且结构将来也不会变更,就可以使用访问者模式,用各种不同用途的访问者,以同样的方式访问这个组合结构。
装饰
动态地给一个对象添加一些职责,就扩展功能来说,装饰模式相比生成子类更为灵活。
- Cocoa Touch中使用装饰模式
Categoty
是一个Objective-C
的语言功能,通过它可以向类添加行为(方法的接口与实现),而不必进行子类化。然而,Categoty
并不是一种严格的实现,它实现了模式的意图,但确是一种变体,由Category
添加的行为是编译时绑定的,虽然Objective-C
原本支持动态绑定。Category
实际上没有封装被扩展的类的实例。
责任链
对象引用了同一类型的另一个对象,形成一条链,链中的每个对象实现了同样的方法,处理链中第一个对象发起的同一个请求。如果一个对象不知道如何处理请求,它就把请求传给下一个响应器。这个过程会一直进行下去,直到请求被传到链中的最后一个Handller
算法封装
模版方法
在抽象类的一个方法中定义“标准”算法。在这个方法中调用的基本操作应由子类重载予以实现。这个方法被称为模版
模版方法模式:定义一个操作中算法的框架,而将一些步骤延迟到子类中,模版方法使子类可以重定义算法的某些特定步骤而不改变该算法的结构。
- Cocoa Touch框架中使用模版方法
框架设计师可以把算法中应用程序相关的元素留给应用程序去实现。
- UIView类中的定制绘图
-(void)drawRect:(CGRect)rect
- UIViewController定义了一些让用户程序处理设备不同方向的方法。
策略
策略模式中的一个关键组件是策略类,它为所有支持的或相关的算法声明了一个共同接口。
定义一系列算法,把它们一个个封装起来,并且使他们可相互替换。本模式可使得算法可独立于使用它的客户而变化。
命令
把指令封装在各种命令对象中,命令对象可以被传递并且在指定时刻被不同的客户端复用。
命令模式:将请求封装为一个对象,从而可用不同的请求对客户进行参数化,对请求排队或记录请求日志,以及支持可撤销的操作。
命令对象另一个为人熟知的应用是推迟调用器的执行。
- Cocoa Touch框架中使用命令模式
NSInvocation、NSUndoManager和目标-动作机制是框架中对这个模式的典型应用。
性能与对象访问
享元(Flyweight pattern)
专门用于设计可共享对象的一种设计模式。
实现享元模式需要两个关键组件,通常是可共享的享元对象和保存它们的池。
代理
代理的一个常见用处是作为一个轻量的替身对象,它允许客户端首先访问某些廉价的信息或功能。
代理模式:为其他对象提供一种代理以控制对这个对象的访问。
- Cocoa Touch框架中使用代理模式
NSProxy实现了NSObject协议,所以NSProxy对象实际上也是NSObject类型,NSProxy的主要作用是,为其他对象的替身对象定义一个API。发给代理对象的消息会被转发给实体对象,或者,让代理加载实体对象或把代理自身变成实体对象
对象状态
备忘录
用来保存对象的状态并在后来进行恢复
备忘录模式:在不破坏封装的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可将该对象恢复到原先保存的状态。
- Cocoa Touch框架中的备忘录模式
Cocoa Touch框架在归档、属性列表序列化、和核心数据中采用了备忘录模式。Cocoa的归档是对对象及其熟悉还有其他对象间的关系进行编码,形成一个文档,该文档可保存于文件系统,也可在进程或网络间传送。被编码与解码的对象必须遵守NSCoding协议并实现一下方法:
1 | -(id)initWithCoder:(NSCoder*)coer; |