作为一种面向对象类型的语言,OC中也有各种设计模式的体现,这里讲到的是代理(委托)设计模式。

首先我们来理解一下什么是委托设计模式, 

     1.委托(delegate)也叫代理,是iOS开发中常用的设计模式。

     2.代理模式是一种简单而功能强大的设计模式,这种模式用于一个对象“代表”另外一个对象和程序中其他的对象进行交互。 

     3.主对象(这里指的是delegating object)中维护一个代理(delegate)的引用并且在合适的时候向这个代理发送消息。这个消息通知“代理”主对象即将处理或是已经处理完了某一个事件。

    4.这个代理可以通过更新自己或是其它对象的UI界面或是其它状态来响应主对象所发送过来的这个事件的消息。或是在某些情况下能返回一个值来影响其它即将发生的事件该如何来处理。

    5.代理的主要价值是它可以让你容易的定制各种对象的行为。

    6.注意这里的代理是个名词,它本身是一个对象,这个对象是专门代表被代理对象来和程序中其他对象打交道的。

  那么,总而言之呢,代理设计默认的基本思想就是,两个对象在协同解决问题,通常运用于对象间通信。这里是不同于使用多态,多态里使用了继承,而代理无需子类化,只需要代理类实现了相关的协议,这就最大化的减少了对象之间的耦合度,从而使得我们应用程序的开发更加灵活。


说到这里,我们具体如何实现一个代理呢。具体的方法是这样的

1.首先我们要定义一个协议,可以单独建立一个文件,也可以写在一个类里面,然后我们要在协议里声明遵循这个协议的代理类需要实现的方法列表。

2.创建代理类,让这个代理类遵循这个协议,并实现相关的方法

3.在需要代理对象的类中,定义一个对象类型为ID并且遵循了代理协议的代理类对象_delegate,作为该类的成员变量

4.在需要代理的类的实现文件中,在其方法中调用其成员变量_delegate的方法,来完成需要代理来完成的功能

5.在需要使用代理的地方,我们将代理类的对象赋值给需要代理的类里成员变量

     接着我们来看一个小的代码示例,更进一步来理解委托设计模式     问题描述:一个人Person要听音乐,可是自己又不能播放音乐,所以我们使用代理设计模式,设置了一个协议PlayerProtocol 有播放音乐的功能playeMusic,而代理类酷狗音乐KuGouPlayer遵循协议,实现了播放音乐的功能。于是人听音乐的时候,使用了其成员变量(一个实现协议的代理类对象)播放音乐的功能。那么具体的实现如下:

/********协议文件:PlayerProtocol.h*****/
#import <Foundation/Foundation.h>
//定义一个协议,声明一个可以播放音乐的方法
//格式:@protocol +协议名称+ <基于基协议或其他协议>
@protocol PlayerProtocol <NSObject>
 - (void)playeMusic;
@end
/********代理类的声明文件:KuGouPlayer.h*****/
#import <Foundation/Foundation.h>
#import "PlayerProtocol.h"
//声明一个酷狗音乐播放器,来遵循协议
  @interface KuGouPlayer : NSObject<PlayerProtocol>
  @end
/********代理类的实现:KuGouPlayer.m*****/
#import "KuGouPlayer.h"
#import "PlayerProtocol.h"
//声明一个酷狗音乐播放器,来遵循协议
@implementation KuGouPlayer
//实现协议中的方法
 - (void)playeMusic{
     NSLog(@"播放一首美妙的音乐。。。");
 }
  @end
/********使用代理类的Person声明:Person.h*****/
#import <Foundation/Foundation.h>
#import "PlayerProtocol.h"
//创建一个Person对象,此对象中有听lisentMusic的方法
  @interface Person : NSObject
 {
     //在这里设置一个实例变量
     //该变量的类型是id,而且遵循相关的协议
     id _delegate;
 }
//设置代理的方法
 - (void)setDelegate:(id<PlayerProtocol>)delegate;
//此方法表示人要听音乐,但是自己又没法播放音乐
 - (void)listenMusic;@end
/********使用代理类的Person实现:Person.m*****/
#import "Person.h"
@implementation Person

 - (void)setDelegate:(id<PlayerProtocol>)delegate{
     _delegate = delegate;
 }

 - (void)listenMusic{
     //实现人听音乐的方法
     NSLog(@"我要听音乐");
     //但是人又没有播放音乐的功能,所以要使用代理来完成
     //代理来播放音乐
     [_delegate playeMusic];} 
@end
/********main方法中测试*****/
#import <Foundation/Foundation.h>
#import "Person.h"
 #import "KuGouPlayer.h"
 int main(int argc, const char * argv[]) {
     @autoreleasepool {
     //创建一个Person对象
         Person *ps = [[Person alloc] init];
     //创建一个播放器对象
         KuGouPlayer *player = [[KuGouPlayer alloc] init];
     //将代理类的播放器对象赋值给人的代理_delegate
         [ps setDelegate:player];
     //人听音乐
         [ps listenMusic];
     }
     return 0; }

 这就是OC中代理设计模式的简单实现,人调用了代理酷狗播放器的方法,播放了音乐,代理模式减少了对象之间的耦合度,在程序设计中用的还是很广泛的,值得我们去好好学习,并学会灵活应用。