(iOS开发总结)代理模式

一、代理模式

代理模式(Delegate)即委托模式,不仅在应用开发中经常使用,而且是iOS SDK设计中常见的一种设计模式,例如UIKit框架中UI的交互逻辑通常需要开发人员自定义代理类去处理。

开发中代理模式常见用途

  • 传值
  • 功能分化接口设计
  • 交互接口(自定义控件)

二、理解

撇开学科概念,代理俩字的意思是:一方帮助另一方代为处理(完成)一些工作或者任务。作为名词,则这个“一方” 就叫代理。如此理解,代理也可为独立的一者。

那么在开发这里,开始应该是这样:
类A引用着一个类B对象,类A中调用类B对象方法,那么类B对象就是一个代理,它帮A完成一些工作。 逻辑上A与B可能是整体与部分关系,也可能是平行关系,所以在设计中尽可能的封装类,实现功能分化。 因为代理是第三者,在代码中表现为一个类的对象,本质是一个类型对象的指针。

既然代理是实体对象, 如果类C、类D..与类B预备同样的功能约束,那么它们就可以取代类B成为类A的代理,即类型也可以是不同类型但得有一定约束。在开发中,如果A不确定要哪个做代理,通常将这个第三者代理对象泛指,就是指向谁,谁就做A的代理。代码中表现为一个id对象,本质是一个泛型指针,即可指向B/C,也可指向D。光是声明为id对象还不够,还要求C和D具有相同的功能,在代码中,这句话表现为Protocol(即协议,Java中为接口)。

这就是说各个类A的对象可以指定不同类型的对象作为它自己的代理。

三、总结

将以上所说A想成是功能受众,即B、C、D完成一些功能后,结果由A承受。
这种应用常见于回调传值和功能分化接口设计。其实是一个意思:将具体部分的功能分化成B/C/D,A在执行过程中,调用B/C/D完成一些功能,完成后将结果作用于A。传值在界面交互之间用的比较多(Block 也通常被用来传值,和代理传值统称为回调传值)。

但如果将上所说A想成是功能复用的,B/C/D反而是功能受众。则更能体现iOS SDK中代理模式的出神入化。比之如UIKit框架许多View的设计都是采用代理模式,如UIAlertView/UIActionSheet、UITableView/UICollectionView,UIPickerViewController等等。

它们有些共同点:

  • 它们可以交互
  • 而且他们的代理通常设置成当前View Controller
  • 它们内部的功能都是复用的
  • 设置代理目的都是将功能作用于View Controller

在项目中View Controller繁多,就相当于B/C/D,这些View就是A。它们采用的都是代理模式与View Controller交互,只不过View Controller才是功能受众。

所以在自定义控件的时候,可以多些考虑用代理模式设计控件用户交互。

四、多代理

以上所述代理是一对一的模式,比较简单,当然在设计中可能存在多层代理,对象之间是以分层结构,A为B代理,B又为C的代理,或者反过来理解,B需要从C承受一些东西,A又从B承受一些东西,但实际上还是属于一对一的代理结构

但在这里还有这种结构,就是多代理,一对多的结构。比如,在Socket编程中,通常Socket对象只有一个,是各种复杂结构的远程数据的接口,然而这些数据是分不同处理的,这些处理就有不同的模块去封装,那么数据要想到达对应的模块,就需要Socket对象或者是最上层的接受数据的对象把接受到的数据分发到各个模块,让各个模块决定是否处理该数据。典型的例子就是XMPPFramework框架,通过一个XMPPStream对象接收数据,后交给各个Extension去处理,Roster处理通讯录数据,Reconnect处理连接数据等等。

XMPPFramework 是目前比较强大的 iOS 客户端即时聊天的开源第三方框架, 采用的是XMPP协议。这个框架中,与服务器的交互依赖于XMPPStream对象,包括连接,聊天等。就是说所有类型数据都是从这个对象中进来。

IM应用中的好些功能,比如好友、群组、重连、缓存,在XMPPFrameWork框架中以扩展的形式存在,它们表现成一个个的类,它们的数据包形式各不相同。XMPPStream的设计巧妙的采用了代理模式,让各个扩展对象成为它的代理,这样一来,只要XMPPStream接收到了数据,就将数据让对应的代理去解析,如此一来完成了功能。

XMPPStream是一个单例对象,那么代理必然是一个集合,用来引用各个功能模块的代理对象。在XMPPFrameWork中定义了一个GCDMuticastDelegate类,用来存储和管理众多代理,数据来的时候,XMPPStream就可将数据作用于各个代理对象。( 这个类方便扩展,可以借鉴)

XMPPStream的代理设计目的也是出自为众多扩展服务,各个代理对象才是真正的功能受众对象。这样,如果需要添加功能类型扩展,只需让该扩展成为XMPPStream对象的代理,然后在代理方法中处理自己的逻辑便可。

五、随想

既然代理是一个对象,只要具备基本的应用条件便可做代理。在iOS 开发中,类本身是一个对象,那么它和它的实例对象都可以作为它自己的代理。这样就可以把一些通用的东西写在自己类中。

  • 那么为了减轻View Controller的负荷,我们可以把一些View的代理定义成一个对象,然后让View Controller引用它即可。比如UITableView,我们可以定义个类实现UITableViewDataSource,则可以将UITableViewDataSource的方法抽离出来,让它成为我们自定义对象的实例方法,只提供Cell的定义接口。
  • 将代理模式实现为Block形式,让自己成为自己的代理,让后在提供Block接口给代理对象。比如,将UIAlertView的代理改成block形式,那么创建的时候就直接在后面加上block处理,而且一个界面如果有多个UIAlertView的时候,可以减少tag判断。
  • 可以用来自己做一些资源清理 (比如语音,视频资源)
  • 通常在应用与用户交互时,改变一个成员变量的值会触发很多动作。借鉴GCDMuticastDelegate类,让这些动作代理自己管理,避免View Controller代码逻辑混乱。
时间: 2024-11-02 08:10:28

(iOS开发总结)代理模式的相关文章

(iOS开发总结)MVC模式

一.MVC 模式 MVC,即模型-视图-控制器(Model-View-Model),是软件开发中应用甚广的一种设计模式.其用意是将数据与视图分化,利用模型数据控制视图的显示,但两者的交互由控制器控制.在iOS开发中,MVC模式应用很广,是iOS控件设计的主要模式之一. UITableView与UICollectionView 可以说是iOS开发中最能体现MVC模式的两种控件,以下举UITableView为例,其中UITableViewCell是做显示任务的View,那么每行UITableView

浅析.NET开发中代理模式的使用

当我们需要使用的对象很复杂或者需要很长时间去构造,这时就可以使用代理模式(Proxy).例如:如果构建一个对象很耗费时间和计算机资源,代理模式(Proxy)允许我们控制这种情况,直到我们需要使用实际的对象.一个代理(Proxy)通常包含和将要使用的对象同样的方法,一旦开始使用这个对象,这些方法将通过代理(Proxy)传递给实际的对象. 一些可以使用代理模式(Proxy)的情况: 1.一个对象,比如一幅很大的图像,需要载入的时间很长. 2.一个需要很长时间才可以完成的计算结果,并且需要在它计算过程

iOS设计模式之代理模式

代理模式 基本理解 代理模式(Proxy),为其他对象提供一种代理以控制对这个对象的访问. 代理模式的应用 远程代理:就是为一个对象在不同的地址空间提供据不代表.这样可以隐藏一个对象存在于不同地址空间的事实. 虚拟代理:是根据需要创建开销很大的对象,通过它来存放实例化需要很长时间的真实对象. 安全代理:用来控制真实对象访问时的权限. *智能指引:是指当调用真实的对象时,代理处理另外一些事. 例子 ChildViewCongroller.h // // ChildViewController.h

实例讲解如何在iOS应用开发中使用设计模式中的代理模式_IOS

代理模式是OC中一种常见的设计模式,那么什么是代理模式呢?举个栗子,假设你是一个日发货量过万的淘宝卖家(A),但是每天的派件不可能你本人或者让你的员工去派件,因此你发布了一条信息(B),上面注明各种要求,各大快递公司看到有那么大的利益纷纷上门沟通,最后你选择了一件快递公司(C).那么在上面的例子中,我们即是委托人,发布的信息即协议(protocol),上面规定了派件人需要完成的事,而最后选择的快递公司也就是代理人(delegate),代理我们去派件. 类图: 根据以上类图,可以知道在代理模式中的

iOS 开发中的 Flux 架构模式

本文讲的是iOS 开发中的 Flux 架构模式, 在半年前,我开始在 PlanGrid iOS 应用程序中采用 Flux 架构(开发).这篇文章将会讨论我们从传统的 MVC 转换到Flux的动机,同时分享我们目前积累到的经验. 我尝试通过讨论代码来描述我们大部分的 Flux 实现, 它用于我们今天的产品中. 如果你只对综合结果感兴趣, 请跳过这篇文章的中间部分. 为什么从 MVC 转移 为了引入我们的决定, 我想要先谈一谈 PlanGrid 这个应用遇到的一些挑战.一些问题仅针对企业级应用程序,

iOS开发入门:iOS常用设计模式–委托模式案例实现

我们以UITextFieldDelegate为例来说明一下委托的使用. UITextFieldDelegate是控件UITextField的  委托,控件的委托主要负责响应控件事件或控制其他对象.除了UITextField,WebView.UITableView等控件也有相应的委托对象. 打开UITextFieldDelegate的API文档,其中有4个有关编辑的方法,还要3个其它方法. 开发入门:iOS常用设计模式–委托模式案例实现-"> 这里我们在编辑过程中消息的发送,UITextFi

iOS开发入门:iOS常用设计模式–委托模式

对于iOS开发,举例Cocoa框架下的几个设计模式为大家分析.当然,Cocoa框架下关于设计模式的内容远远不止这些,我们选择了常用的几种:单例模式.委托模式.观察者模式.MVC模式. 委托模式 委托模式从GoF 设计装饰(Decorator).适配器(Adapter)和模板方法(Template Method)等模式演变而来.几乎每一个应用都会或多或少地使用到委托模式.不只是CocoaTouch框架,在Cocoa框架中委托模式也得到了广泛的应用. 问题提出 对于应用生命周期的非运行状态--应用启

iOS开发之网络编程--5、NSURLSessionUploadTask+NSURLSessionDataDelegate代理上传

前言:关于NSURLSession的主要内容快到尾声了,这里就讲讲文件上传.关于文件上传当然就要使用NSURLSessionUploadTask,这里直接讲解常用的会和代理NSURLSessionDataDelegate一起搭配实现文件上传功能.另外,下面使用的文件上传思路是和NSURLConnection中本人之前的随笔<iOS开发之网络编程--使用NSURLConnection实现文件上传>提到的上传思路是一样的,都是要将请求信息拼接起来,然后传入到请求里进行上传.这个拼接过程是必要的,但

iOS开发那些事-iOS常用设计模式–委托模式

对于iOS开发,举例Cocoa框架下的几个设计模式为大家分析.当然,Cocoa框架下关于设计模式的内容远远不止这些,我们选择了常用的几种:单例模式.委托模式.观察者模式.MVC模式. 委托模式 委托模式从GoF 设计装饰(Decorator).适配器(Adapter)和模板方法(Template Method)等模式演变而来.几乎每一个应用都会或多或少地使用到委托模式.不只是CocoaTouch框架,在Cocoa框架中委托模式也得到了广泛的应用. 问题提出 对于应用生命周期的非运行状态--应用启