为什么使用委托?

答:比如,我上班的工作主要内容包括 (1)写代码(2)写文档(3)测试程序(4)接电话(5)会见客户
(1)(2)我自己全权负责,但是后面(3)(4)(5)我不想或者不方便自己做,所以我想找个助手(delegate)帮我做这些事,于是我定了一个招聘要求(Protocol),里写明我的助手需要会做(3)(4)(5)这三件事。很快,我招到一个助手。

我.delegate = 助手;

于是以后每当我遇到需要测试程序或者接电话的活,我就把他转交给助手(delegate)去处理,助手处理完后如果有处理结果(返回值)助手会告诉我,也许我会拿来用。如果不需要或者没有结果,我就接着做下面的事。

1 协议(Protocol)

协议限制了实现类必须拥有哪些方法。它是对对象行为的定义,也是对功能的规范。
示例:

// GoodChild.h
#import <Foundation/Foundation.h>
@protocol GoodChild <NSObject>
-(void)filialPiety; //孝顺
@end
 // Student.h
#import <Foundation/Foundation.h>
#import "GoodChild.h"
//注意实现协议的语法。
@interface Student : NSObject<GoodChild>
@end // Student.m
#import "Student.h"
@implementation Student
- (id)init {
self = [super init];
if (self) { // Initialization code here.}
return self;
}
-(void)filialPiety{ NSLog(@"孝敬父母。。");}
@end

此例中定义了一个协议GoodChild,类Student实现了此协议,所以必须有filialPiety方法。每个类虽只有一个父类,但可以实现多个协议,以逗号隔开便可。语法如下:

@interface Student : NSObject<协议1,协议2>
@end

2.委托(Delegate)

委托是objC中使用非常频繁的一种设计模式,它的实现与协议的使用是分不开的。

让我们看一个综合示例:小公司老板日常的工作是管理公司、教导新员工、发工资与接电话。其中管理公司、教导新员工是老板要亲为的。而发工资与接电话老板希望招聘一个秘书来帮忙,于是对秘书的要求就是要略懂出纳发工资,要能帮助领导接电话。而这两项要求便是协议,对类功能的限定。

 // SecProtocol.h
#import <Foundation/Foundation.h>
@protocol SecProtocol <NSObject>
//发工资
-(void)payoff;
//接电话
-(void)tel;
@end

然后定义一个秘书类:

// Sec.h
#import <Foundation/Foundation.h>
#import "SecProtocol.h"
@interface Sec : NSObject<SecProtocol>
@end // Sec.m
#import "Sec.h"
@implementation Sec
- (id)init {
self = [super init];
if (self) {
// Initialization code here. }
return self; }
-(void)payoff{ NSLog(@"sec payoff"); }
-(void)tel{ NSLog(@"sec tel"); }
@end

紧接着是老板类:

 // Boss.h
#import <Foundation/Foundation.h>
#import "SecProtocol.h"
@interface Boss : NSObject
//此属性用于指定秘书对象,此对象必须实现SecProtocol协议。
@property(nonatomic,retain) id<SecProtocol> detegate;
//管理
-(void)manage;
//教导新员工
-(void)teach;
@end // Boss.m
#import "Boss.h"
@implementation Boss
@synthesize detegate=_detegate;
- (id)init {
self = [super init];
if (self) { // Initialization code here.}
return self; }
-(void)manage{
NSLog(@"boss manage"); }
-(void)teach{
NSLog(@"boss teach"); }
-(void)payoff{
NSAutoreleasePool *p=[[NSAutoreleasePool alloc] init];
[_detegate payoff];
[p release]; }
-(void)tel{
NSAutoreleasePool *p=[[NSAutoreleasePool alloc] init];
[_detegate tel];
[p release]; }
@end

那么老板就具有这4个方法,当调用前2个时是自己完成功能,而调用后2个时则转为调用秘书的方法。此时我们跟秘书对象就叫做代理对象,代理模式的名字由来于此。最后调用测试下:

// main.m 

 #import <Foundation/Foundation.h>
#import "Boss.h"
#import "Sec.h"
int main (int argc, const char * argv[]) {
NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
//实例化老板对象
Boss *boss=[[[Boss alloc] init] autorelease];
//实例化秘书对象
Sec *sec=[[[Sec alloc] init] autorelease];
//设置老板的代理对象为秘书
boss.detegate=sec;
//调用4个方法。
[boss payoff];
[boss tel];
[boss manage];
[boss teach];
[pool drain];
return ;
}

Protocol and Delegate的更多相关文章

  1. 传参方法:sharedApplication, NSUserDefaults, protocol 和 delegate(实例)

    本文转载至  http://blog.csdn.net/learnios/article/details/8442201 分类: 功能模块2012-12-27 10:22 109人阅读 评论(0) 收 ...

  2. 简单例子让你很好的理解:协议与委托 (Protocol and Delegate)

    1 协议: 协议,类似于Java或C#语言中的接口,它限制了实现类必须拥有哪些方法. 它是对对象行为的定义,也是对功能的规范. 示例: 1 2 3 4 5 6 7 8 9 // GoodChild.h ...

  3. ios回调函数的标准实现:protocol+delegate

    一.项目结构

  4. Protocol and Delegate协议和代理

    1.什么是协议?  OC协议仿照Java的接口.协议和接口,都是不同类的对象之间一种通信的机制.2.协议的基础语法  单纯的语言描述协议的语法,很难让人理解,主要因为在OC中协议是类对象的通信机制,他 ...

  5. IOS开发之----协议与委托(Protocol and Delegate) 实例解析

    1 协议: 协议,类似于Java或C#语言中的接口,它限制了实现类必须拥有哪些方法. 它是对对象行为的定义,也是对功能的规范. 在写示例之前我给大家说下@required和@optional这两个关键 ...

  6. iOS开发之protocol和delegate

     protocol--协议 协议是用来定义对象的属性,行为和用于回调的.     协议中有两个keyword@private和@optional,@private表示使用这个协议必需要写的方法,@op ...

  7. protocol 和delegate(协议和代理)的区别

    定义 protocol:中文叫协议,一个只有方法体(没有具体实现)的类,Java中称作接口,实现协议的类必须实现协议中@required标记的方法(如果有的话): delegate:中文叫代理或委托, ...

  8. Protocol, Delegate

    协议的构成: 协议:用来指定代理双方可以做什么,必须做什么. 代理:根据指定的协议,完成委托方需要实现的功能. 委托:根据指定的协议,指定代理去完成什么功能. 协议的修饰符: 协议有两个修饰符@opt ...

  9. protocol 和 delegate

    步骤 1.发出协议(在发协议者.h文件 下@interface-@end 上边) @protocol hireOneMaid <NSObject> @required//必须要实现的方法( ...

随机推荐

  1. 【转】包管理器Bower详细讲解

      包管理器Bower   今天自己用Angular写东西的时候,下载了Angular-seed项目,发现需要用到bower,之前也使用过,没有仔细了解,今天趁机了解到一些. bower的官网地址:  ...

  2. HTML head 头标签

    HTML head 头部分的标签.元素有很多,涉及到浏览器对网页的渲染,SEO 等等,而各个浏览器内核以及各个国内浏览器厂商都有些自己的标签元素,这就造成了很多差异性.移动互联网时代,head 头部结 ...

  3. Codeforces Round #208 (Div. 2) A.Dima and Continuous Line

    #include <iostream> #include <algorithm> #include <vector> using namespace std; in ...

  4. js-sdk探索之微信网页分享

    微信是一个很不错的传播平台,最近公司需要做一个新年贺卡,使用html5制作一个很小的动画,然后发送给客户,不需要和后台有任何的联系,一个很简单的功能,需要利用微信的分享功能,毕竟微信分享的带小图片.简 ...

  5. 【BZOJ】1051: [HAOI2006]受欢迎的牛(tarjan)

    http://www.lydsy.com/JudgeOnline/problem.php?id=1051 这题还好-1A了..但是前提还是看了题解的 囧.....一开始认为是并查集,oh,不行,,无法 ...

  6. HDU 4630 No Pain No Game(树状数组)

    题目链接 看的别人的题解,离线之后,按r排序,枚举1-n,利用pre[j],存上次j的倍数出现的位置,树状数组里统计的当前位置到最后的最大值,树状数组是求区间最值其实应该很麻烦的,但是此题用法只是求到 ...

  7. sql server 取随机行

    --从table_name中随机取n行 select top n * from table_name order by NEWID()

  8. 深入理解JVM—性能监控工具

    (转自:http://yhjhappy234.blog.163.com/blog/static/31632832201222691738865/) 我们知道,在JVM编译期和加载器,甚至运行期已经做了 ...

  9. MatLab 组件大全

    MATLAB                                                                    矩阵实验室 7.0.1 Simulink       ...

  10. stack, deque 和 queue的对比

    stack, deque 和 queue这三个c++的STL的数据结构很类似但又各有不同. stack是堆栈,没有迭代器,特点是后进先出.用push()将元素压入栈中,top()返回栈顶元素,pop( ...