Objective-c 代理模式(delegate)

(2012-07-31 22:04:39)

标签:

杂谈

分类: iOS
Objective-c 代理模式(delegate)
 
  一、什么事代理模式?
        代理模式是在oc中经常遇到的一种设计模式,那什么叫做代理模式呢? 举个例子:有一个婴儿,他本身不会自己吃饭和洗澡等等一些事情,于是婴儿就请了一个保姆,于是婴儿和保姆之间商定了一个协议,协议中写明了保姆需要做什么事情, 而保姆就是这个代理人,  即:婴儿和保姆之间有个协议,保姆继承该协议,于是保姆就需要实现该协议中的条款成为代理人。
 
二、 代理模式的关键点:
     A完成一件事,但是自己不能完成,于是他找个代理人B 替他完成这个事情,他们之间便有个协议 (protocol),B继承该协议来完成A代理给他的事情。 
 
三、实例分析
    下面来举一个经典的实例,妈妈和保姆的例子:妈妈把孩子委托给保姆照顾,于是将需要完成的事情写成一个协议:协议声明如下:

#import <Foundation/Foundation.h>

@protocol Job <NSObject>

-(void)takeEat;

-(void)takeSleep;

-(void)takePlay;

-(void)takeShower;

@end

我们再声明Nurse类 即代理的人:

#import <Foundation/Foundation.h>

#import "Job.h"

@interface Nurse : NSObject<Job>//实现该协议

@end

实现文件:

#import "Nurse.h"

@implementation Nurse

-(void)takeEat

{

NSLog(@"小孩饿了,喂它吃饭");

}

-(void)takeSleep

{

NSLog(@"小孩困了,哄他睡觉");

}

-(void)takePlay

{

NSLog(@"小孩醒来了,陪他玩");

}

-(void)takeShower

{

NSLog(@"晚上给小孩洗澡");

}

-(void)dealloc

{

NSLog(@"Nurse is dealloc");

}

@end

再声明一个morther类:

#import <Foundation/Foundation.h>

#import "Job.h"

@class Nurse;

@interface Morther : NSObject

{

NSString *name;

id<Job> delegate;   //此处声明一个代理人,从而mother可以让代理人完成需要代理的事情

}

-(id)initWithName:(NSString *)_name delagat:(id<Job>)_delagete;  //传入代理人

@property(nonatomic,copy)NSString *name;

-(void)delagateThings;// 被代理的事情

@end

//实现文件

#import "Morther.h"

#import "Nurse.h"

@implementation Morther

-(id)initWithName:(NSString *)_name delagat:(id)_delagete

{

self=[super init];

if (self) {

if (name!=_name) {

[name release];

name=[_name copy];

[delegate release];

delegate=[_delagete retain];

}

}

return self;

}

@synthesize name;

-(void)dealloc

{

[name release];

[delegate release];

NSLog(@"host is dealloc");

}

-(void)delagateThings

{

int i;

switch (i) {

case 1:

[delegate takeEat];

break;

case 2:

[delegate takePlay];

break;

case 3:

[delegate takeShower];

break;

case 4:

[delegate takeSleep];

break;

default:

break;

}

i++;

}

@end

看看 在 main 文件中是怎么实现的:

#import <Foundation/Foundation.h>

#import "Morther.h"

#import "Nurse.h"

#import "Job.h"

int main (int argc, const char * argv[])

{

@autoreleasepool {

NSString *name=[[NSString alloc] initWithFormat:@"小花"];

Nurse *fengjie=[[Nurse alloc] init];//代理人 fengjie

Morther *morther=[[Morther alloc] initWithName:name delagat:fengjie];//这样就将代理人传入mother 对象中,这样morther对象便可以通过nurse来完成她自己不能坐的事情了。

[name release];

[NSTimer scheduledTimerWithTimeInterval:2 target:morther selector:@selector(delagateThings) userInfo:nilrepeats:YES];  //调用机制,  2秒调用一次, 调用的对象是morther , 调用的方法是delagateThings;

[[NSRunLoop currentRunLoop] run];  //让程序一直运行下去,保证上面的调用可以一直进行

[morther release];

[fengjie release];

}

return 0;

}

代理中,需要记住的关键是在发出代理请求的类(A)中声明代理人(B)的实例变量,这样就可以保证A 能通过调用B中B代理的方法来完成B代理的事情,即自己代理给B 的事情。

Objective-c 代理模式(delegate)的更多相关文章

  1. IOS 代理模式 DELEGATE

    代理模式:将我(类或结构体)需要来完成的工作交给另一个具备我所要求的能力的人(实现协议的对象)来执行 协议:具备哪些能力 例子:我要去买火车票,没时间买,委托黄牛买票 协议:买票 //: Playgr ...

  2. Swift语言精要 - 浅谈代理模式(Delegate)

    在iOS编程中,我们经常谈到代理代理,也就是delegate,那么什么是代理呢? 我们来看一下cocoa对它的描述: Delegation is Cocoa’s term for passing of ...

  3. iOS代理模式(delegate)的使用

    前言: 代理模式是iOS中非常重要的一个模式,iOS SDK中的系统控件几乎都用到了代理模式.代理模式用来处理事件监听.参数传递功能. 协议创建(Protocol): 可手打如下代码,或者在代码块里面 ...

  4. 【原】谈谈对Objective-C中代理模式的误解

    [原]谈谈对Objective-C中代理模式的误解 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 这篇文章主要是对代理模式和委托模式进行了对比,个人认为Objective ...

  5. 设计模式(十三):从“FQ”中来认识代理模式(Proxy Pattern)

    我们知道Google早就被墙了,所以FQ才能访问Google呢,这个“FQ”的过程就是一个代理的过程.“代理模式”在之前的博客中不止一次的提及过,之前的委托回调就是代理模式的具体应用.今天我们就从“F ...

  6. Objective-C中的委托(代理)模式

    我个人更喜欢把委托(Delegate)模式称为代理(Proxy)模式.还是那句话,第一次接触代理模式是在Java中接触的,在Java中实现代理模式和接口是少不了的.当时学习Spring的时候用到了接口 ...

  7. iOS重一些常用的代理模式

    (一)代理模式 应用场景:当一个类的某些功能需要由别的类来实现,但是又不确定具体会是哪个类实现.优势:解耦合敏捷原则:开放-封闭原则实例:tableview的 数据源delegate,通过和proto ...

  8. iOS:使用代理模式监听开关状态改变事件

    记一次解决跨控制器监听开关状态改变的尝试. 为了统一设置UITableViewCell里的内容,自定义了UITableViewCell类的一个基类,命名为SettingCell.SettingCell ...

  9. iOS开发-代理模式

    代理模式有的时候也被称之为委托模式,但是实际上两者是有分别的,代理模式为另一个对象提供一个替身或占位符访问这个对象,代理对象和控制访问对象属于同一类,委托对象和对象不一定属于同一类.两者都可以控制类的 ...

随机推荐

  1. Oil Deposits(dfs)

    Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission( ...

  2. 软件打开时间、窗体透明度、背景色---《用delphi开发共享软件》-15.1任务管理器

    1.计算软件启动了多长时间:用定时器,每分钟触发一次: procedure TFrmMain.tmCheckLegalTimer(Sender: TObject);Var Minutes:LongIn ...

  3. Git分支操作

    1.创建分支 git branch <分支名> 2.切换分支 git checkout <分支名> 该语句和上一个语句可以和起来用一个语句表示: git checkout -b ...

  4. 经典的nav导航

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  5. WPF 2D 碰撞检测

        var intersectionDetail = path1.Data.FillContainsWithDetail(path2.Data); if (intersectionDetail ! ...

  6. HDU5735 : Born Slippy

    考虑DP,设$f[x]$表示最后一个是$x$时的最优解,则$f[x]=\max(f[y]+w[x]\ opt\ w[y])$,其中$y$是$x$的祖先. 注意到$w[i]<2^{16}$,那么将 ...

  7. Android的Proxy/Delegate Application框架 (主要介绍插件化开发)

    1. 插件化的原理 是 Java ClassLoader 的原理:Java ClassLoader基础 常用的其他解决方法还包括:Google Multidex,用 H5 代替部分逻辑,删无用代码,买 ...

  8. [题解]扫雷Mine

    // 此博文为迁移而来,写于2015年2月6日,不代表本人现在的观点与看法.原始地址:http://blog.sina.com.cn/s/blog_6022c4720102vrft.html 1088 ...

  9. Windows Phone 8 LongListSelector实现下拉自动刷新列表

    LongListSelector是一个加强版的列表控件,它可以实现分组的列表,如系统人脉列表的交互效果就可以利用LongListSelector控件去实现,同时LongListSelector也一样可 ...

  10. HDU 4433 locker(SPFA+DP)

    题目链接 去年区域赛的题目,早就看过题目了,又是过了好久了... 这题状态转移,一看就知道应该是 线性的那种,不过细节真的不好处理,一直没想出怎么搞,期间也看过题解,好像没太看懂... dp[i][j ...