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. Bestcoder round #65 && hdu 5592 ZYB's Premutation 线段树

    Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others)Total Submissio ...

  2. js 获取系统时间

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

  3. (转)POJ题目分类

    初期:一.基本算法:     (1)枚举. (poj1753,poj2965)     (2)贪心(poj1328,poj2109,poj2586)     (3)递归和分治法.     (4)递推. ...

  4. git 学习笔记5--rm & mv,undo

    rm 删除文件 rm <file> #Unix删除文件 git rm <file> # git删除文件 git rm -f <file> # git强制删除文件 g ...

  5. JavaScript定时器

    定时器 开启定时器 Setinterval间隔型    每隔一段时间重复的执行 SetTimeout延时型   只执行一次 两种定时器的区别 <!DOCTYPE html> <htm ...

  6. 【原】iOS多线程之异步任务+并行队列情况与异步任务+串行队列(主队列)情况

    异步任务+并行队列 把异步任务放到并行队列进行执行,异步任务会在不同的线程中执行. /*异步执行+并行队列*/ - (IBAction)clickBasic1:(UIButton *)sender { ...

  7. iOS学习09C语言函数指针

    本次主要学习和理解函数指针 1.函数指针 void printValue(int number) { printf("number = %d\n", number); } int ...

  8. unity update 和fixedudpate

    但是Update会在每次渲 染新的一帧时被调用. 而FixedUpdate会在每个固定的时间间隔被调用,

  9. JS正则获取参数值

    var geturl = function(url){ var ret = {}; var queryStr=url.replace(/^[^\?#]*\??/g,'').replace(/#DIAL ...

  10. BZOJ1012[JSOI2008]最大数maxnumber 题解

    题目大意: 维护一个数列,有两种操作:1. 查询当前数列中末尾L个数中的最大的数,并输出这个数的值.限制:L不超过当前数列的长度.2.插入操作:将n加上t,其中t是最近一次查询操作的答案(如果还未执行 ...