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. jquery的隐藏与显示

    ###显示与隐藏,通过用hide()和show()函数来实现 语法: $(selector).hide(speed,callback); $(selector).show(speed,callback ...

  2. C# 词法分析器(二)输入缓冲和代码定位

    系列导航 (一)词法分析介绍 (二)输入缓冲和代码定位 (三)正则表达式 (四)构造 NFA (五)转换 DFA (六)构造词法分析器 (七)总结 一.输入缓冲 在介绍如何进行词法分析之前,先来说说一 ...

  3. git 学习笔记2--How to create/clone a repository

    1. create/clone 1.1 create 针对已经存在的目录创建一个repository,使用以下命令: git init Initialized empty Git repository ...

  4. Codeforces 580D Kefa and Dishes(状压DP)

    题目大概说要吃掉n个食物里m个,吃掉各个食物都会得到一定的满意度,有些食物如果在某些食物之后吃还会增加满意度,问怎么吃满意度最高. dp[S][i]表示已经吃掉的食物集合是S且刚吃的是第i个食物的最大 ...

  5. Java 集合系列08之 List总结(LinkedList, ArrayList等使用场景和性能分析)

    概要 前面,我们学完了List的全部内容(ArrayList, LinkedList, Vector, Stack). Java 集合系列03之 ArrayList详细介绍(源码解析)和使用示例 Ja ...

  6. 【转】SpringTest框架JUnit单元测试用例获取ApplicationContext实例的方法

    转自:http://www.coderli.com/junit-spring-test-applicationcontext JUnit单元测试用例中使用Spring框架,直接方式如下. @RunWi ...

  7. node.js 调用天气webservice接口

    首先安装soap模块 npm install soap 1 2 3 4 5 6 7 8 9 10   var soap = require('soap');   var url = 'http://w ...

  8. HDU 2853 (KM最大匹配)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2853 题目大意:二分图匹配费用流.①最大匹配②最小原配变动 解题思路: 如果去掉第二个要求,那么就是裸 ...

  9. Leetcode Binary Tree Postorder Traversal

    Given a binary tree, return the postorder traversal of its nodes' values. For example:Given binary t ...

  10. Codeforces Round #251 (Div. 2) C. Devu and Partitioning of the Array

    注意p的边界情况,p为0,或者 p为k 奇数+偶数 = 奇数 奇数+奇数 = 偶数 #include <iostream> #include <vector> #include ...