iOS开发:基本设计模式(下)-使用设计模式解决问题

来源:互联网 发布:太原市知达常青藤中学 编辑:程序博客网 时间:2024/05/10 08:54
面向对象的系统(例如应用程序)是动态的。对象在运行时所能做的,并不局限于编写时所设定的行为。一个对象可以向另一个对象发送消息,而同一消息的目标,会根据运行时的情况而变化。一个对象也可以在运行时与可变的一组其他对象合作,并使用多种技巧,有效地完成应用程序的工作。一个对象或一群对象要这样做,必须利用许多技巧和框架架构,它们都是设计模式的派生。
 
      下面部分说明许多这样的技巧和架构。你应该将他们视为 Objective-C 编程工具箱的一部分。

委托:代表另一个对象
      在委托中,一个称为委托的对象应另一个对象的请求,作为该对象的代表。作出委托的对象,通常是框架模型。在执行的某些时候,它会向其委托发送消息,告诉委托即将发生某些事件,并要求给它回应。委托(通常是自定类的实例)实施供该消息调用的方法,并返回相应的值。通常该值是一个 Boolean 值,告诉作出委托的对象是否继续操作。
    IOS开发:使用设计模式解决问题
       委托因此是一种将应用程序特定行为加入框架类工作的手段,而无需给该类创建子类。它是一种常见的、强大的设计,来扩展和影响框架的行为。
   
       你应该记得,在编写“第一个 iOS 应用程序”HelloWorld 时,创建了 HelloWorldAppDelegate 对象。Xcode 自动将其分配为应用程序对象(为框架对象)的委托。应用程序委托可以处理 application:didFinishLaunchingWithOptions:,以及应用程序对象发送给它的其他委托消息。
 
       有两个可编程的组件用于委托。委托类必须定义属性(通过名称为 delegate 的约定),以保存一个指向委托的参考。它还必须声明委托类必须采用的协议(请参阅以下部分以获得有关协议的更多信息)。Cocoa Touch 和 Cocoa 框架的许多类,都提供委托作为一种方式,给应用程序用来增加其特定的框架行为。
 
       但是委托并不局限于框架类。你可以在应用程序的两个自定对象之间实施委托。Cocoa Touch 应用程序常见的设计,是将委托作为一种手段,允许子视图控制器将某些值(通常为用户输入的值)传达到父视图控制器。
 
协议:使不相关的对象之间能通过继承进行通信
       协议是可编程接口的声明,任何类都可以实施它的方法。与协议相关联的类实例,调用协议的方法,并获取由该类正式采用和实现该协议所返回的值。对象之间的此类通信,产生了一个特定目标,例如解析 XML 代码或拷贝对象。协议接口两边的对象可以通过继承,实施远距离彼此相关。协议因此和委托一样,可作为子类化的替换手段,通常是框架实施委托的一部分。
    IOS开发:使用设计模式解决问题
通知中心:通知对事件感兴趣的观察者
       通知中心是 Foundation 框架的一个子系统,它向应用程序中注册为某个事件观察者的所有对象广播消息(即通知)。(从编程角度而言,它是 NSNotificationCenter 类的实例)。该事件可以是发生在应用程序中的任何事情,例如进入后台状态,或者用户开始在文本栏中键入。通知是告诉观察者,事件已经发生或即将发生,因此让观察者有机会以合适的方式响应。通过通知中心来传播通知,是增加应用程序对象间合作和内聚力的一种途径。
    IOS开发:使用设计模式解决问题
       例如,iOS 应用程序中的视图控制器,可以观察 UIKeyboardWillShowNotification 通知,以调整其视图的几何图形,来容纳虚拟键盘。正如此例所示,通知是一个对象,该对象的名称指明了一个特定事件,以及该事件是已经发生或将要发生。它还将一个引用(指向发布或发送通知的对象)送到通知中心,而它可以包含补充信息字典。
 
      任何对象都可以观察通知,但要做到这一点,该对象必须注册,以接收通知。在注册时,它必须指定选择器,以确定由通知传送所调用的方法;方法签名必须只有一个参数:通知对象。注册后,观察者也可以指定发布对象。
 
       通知中心的通知跟委托消息相似;当某些事件发生时,两者都发送给任意对象。但是,处理通知的方法与委托方法不同,它不能返回值。通过通知中心的通知是同步的,与委托一样。
 
       应用程序的自定对象可定义和发布自己的通知,其他自定对象则可以观察该通知。
 
目标-操作:事件发生时封装待发送的消息
       目标-操作设计在概念上很简单。一个对象储存着组成消息表达式的元素,某些事件发生时,将这些元素放在一起,并发送一则消息。这些元素为一个选择器,用来确定消息(即操作)和接收消息的对象(即目标)。目标的类会实现与操作和目标相对应的方法,当它在运行中接收到消息时,会通过执行方法来响应事件。
 
       目标-操作主要是 Cocoa Touch 和 Cocoa 框架中的一种控制功能。控制是用户界面对象,例如用户通过轻按、拖移等进行操控的按钮、滑块或开关,将用户的意图通过信号发送给应用程序。Cocoa Touch 的控制储存了操作和目标;大多数 Cocoa 控制与一个或多个单元对象进行了配对,这些单元对象储存了目标和操作。
    
        一些框架在对象中使用目标-操作而不是控制。例如,在设计手势识别器时,UIKit 框架使用了目标-操作。手势识别对象识别手势后,它将操作消息发送给目标对象。
 
键值观察:值更改时通知观察者
       键值观察(Key-value observing,或简称 KVO)允许对象观察另一个对象的属性。该属性值改变时,会通知观察对象。它了解新值以及旧值;如果观察的属性为对多的关系(例如数组),它也要了解哪个包含的对象发生了改变。KVO 有助于使应用程序变得更内聚,保持模型、控制器和视图层中的对象与改变同步。
       与 NSNotificationCenter 通知相似,多个 KVO 观察者可以观察单一属性。此外,KVO 更动态,因为它允许对象观察任意属性,而不需任何新的 API,例如通知名称。KVO 是一个轻量级点对点通信机制,不允许观察所有实例的特定属性。

基于设计模式的其他框架设计
       Cocoa Touch 和 Cocoa 框架也包含基于设计模式的其他设计,有以下模式:
  
       视图层次:应用程序所显示的视图,会排列成层次结构(直观上基于包含)。此模式允许应用程序将单个视图和合成视图同等对待。层次的根部为一个窗口对象;根部以下的每个视图,都有一个父视图,以及零个或多个子视图。父视图包含子视图。视图层次是绘图和事件处理的结构性组件。
 
       响应器链:响应器链是一系列的对象(主要是视图,但也有窗口、视图控制器和应用程序对象本身),事件或操作消息可以沿着响应器链传递,直到链中的一个对象处理该事件。因此,它是一个合作性事件处理机制。响应器链与视图层次密切相关。
 
       视图控制器:虽然 UIKit 和 AppKit 框架都有视图控制器类,它们在 iOS 中尤其重要。视图控制器是一种特殊的控制器对象,用于显示和管理一组视图。视图控制器对象提供基础结构,来管理内容相关的视图并协调视图的显示与隐藏。视图控制器管理应用程序视图的子层次结构。
 
       前台:在前台模式中,应用程序所执行的工作,从一个执行环境重定向(或弹回)到另一个环境。(执行环境是一个与主线程或辅助线程相关联的调度队列或操作队列。)您将前台模式主要应用于这样的情形:在次队列执行的工作,产生了必须在主队列执行的任务,例如更新用户界面的操作。
 
       类别:类别提供了一种方式,通过将方法添加到一个类,以使该类得到扩展。与委托一样,它可以让您自定行为,而不子类化。类别是 Objective-C 的一个功能,在“编写 Objective-C 代码”中有说明。
0 0
原创粉丝点击