细数iOS中的设计模式(一)

来源:互联网 发布:疯狂水草 淘宝 编辑:程序博客网 时间:2024/05/29 16:29

抽象工厂(Abstract Factory)

为创建一组相关或相互依赖的对象提供一个接口,而且无需指定他们的具体类。客户端与工厂里的具体对象能够进行解耦。

讲到抽象工厂模式就需要讲一下类簇。类簇是将一些私有的、具体的子类组合在一个公共的、抽象的超类下面。抽象的超类定义了创建私有子类实例的方法。超类根据调用的构造方法返回一个合适的私有子类对象。每一个返回的对象都属于一个不同的私有子类。

Cocoa中的类簇只可以用来生成数据存储视情况而定的对象。Foundation框架提供了NSString、NSData、NSDictionary、NSSet和NSArray对象的类簇。包含这些不可变类的公共超类也是这些可变类NSMutableString、NSMutableData、NSMutableDictionary、NSMutableSet和NSMutableArray的补充。

当你想创建类簇中的可变或不可变的对象时,你可以使用类簇中的公共类。在类簇中,简洁性和可扩展性是有一个取舍的。类簇简化了类的接口并且使类更容易理解和使用,但是,要创建一个类簇中抽象超类的子类是很困难的。

适配器模式(Adapter)

适配器模式是将一个类的接口适配成用户所期待的。适配器允许通常因为接口不兼容不能在一起工作的类工作在一起,做法是将类自己的接口包裹在一个已存在的类中。它将客户端与目标对象进行解耦。

协议是Objective-C语言的一个特点,它使得定义适配器模式中的实例的接口成为可能。协议就是跟类无关的接口定义。如果你的客户端对象想和另一个对象进行通信,但是对象的接口又使得通信非常艰难,你可以定义一个协议。对象类通过实现协议的一个或者多个接口来正式实现这个协议。协议可以要求实现协议的类实现它的某些方法,另一些方法可以不需要实现。客户可以通过协议接口来向对象发送消息。

这里举一个UITableView的例子来解释一下。绘制UITableView的时候需要知道每个cell的高度,还需要知道每个cell里的数据,可是它不知道该去哪里获得这些信息。于是就有了UITableViewDataSource和UITableViewDelegate这两个协议,UITableView通过这两个协议的实例去获得她想要的数据,需要使用UITableView的用户就需要去实现这两个协议。实现这两个协议的类就是适配器,因为它将客户(UITableView)需要的接口转换成了她真正需要的。

责任链模式(Chains of Responsibility)

责任链模式通过让更多的对象有机会处理一个请求来达到让请求的发送者和接收者进行解耦的目的。该模式将接收对象链接起来然后将请求对象沿着这个链进行传递,直到有对象能够处理该请求。链中的每一个对象要么处理这个请求,要么将请求传给下一个对象进行处理。

在iOS应用框架中包含了一个叫做响应链的架构。这个链是由一系列响应对象组成的,事件或者动作消息可以沿着这个链被传递并最终被处理。如果链中的某个响应对象不能处理某个消息,它将把这个消息传递给链中的下一个对象。链中响应对象的顺序是由view的继承关系决定的,从继承关系的低级到高级这样一个过程,最后到达管理view继承关系的窗口对象、窗口对象的代理或者全局的应用对象。

拿手指点击事件来举例,当用户点击屏幕时,当前的view会获得这个触摸事件,然后它会遍历它所有的子视图,看是否有能处理此事件的视图,如果没有,它将这个事件再交给她的父视图去处理,直到这个事件被交给窗口对象,如果窗口对象也无法处理的话,这个事件就被丢弃了。