代理是一种简单而功能强大的设计模式,这种模式用于一个对象“代表”另外一个对象去做和实现一些东西。 主对象维护一个代理(delegate)的引用并且在合适的时候向这个代理发送消息,这个消息通知“代理”对象即将处理或是已经处理完了某一个事件。这个代理可以通过更新自己或是其它对象的UI界面或是其它状态来响应主对象所发送过来的这个事件的消息。或是在某些情况下能返回一个值来影响其它即将发生的事件该如何来处理。代理的主要价值是它可以让你容易的定制各种对象的行为。

  为了方便大家理解,我在这里举了个简单的例子,有这样一个情景:一个家庭里有一个孩子,很小还不会吃饭,所以在饿了的时候需要妈妈来喂。在这里我们把孩子当作一个主对象,妈妈当作代理对象看一下代理模式的实现。

直接来看一下代码

TestDelegate.h

@protocol TestDelegate

@required

-(void)feetBaby;

@optional
-(void)playWithBaby; @end

在这里定义了一个代理TestDelegate 注意到代理函数分为@required和@optional两种,前者是必须实现的函数,后者是选择性实现的函数

Baby.h

#import <Foundation/Foundation.h>
#import "TestDelegate.h"
@interface Baby : NSObject
{ }
@property(nonatomic)NSString* name;
@property(nonatomic,retain)id<TestDelegate>delegate;
+(Baby*)initWithName:(NSString*)str;
-(void)hungry; @end

在baby.h中定义了一个delegate对象 并使他的类型为id  因为不知道哪个类的对象会接受这个代理并实现代理函数  所以定义为id类型

Baby.m

#import "Baby.h"

@implementation Baby
@synthesize name;
@synthesize delegate;
+(Baby*)initWithName:(NSString *)str
{
Baby* baby = [[Baby alloc]init];
baby.name = str;
return baby;
}
-(void)hungry
{
NSLog(@"%@ is hungry",self.name);
[delegate feetBaby];
}
@end

 在baby.m中  写了hungry函数  ,因为孩子在饿了的时候  会叫着要吃饭  ,虽然自己不会吃 ,但是知道有人会来喂他,而且不知道这个人是谁,所以在hungry中调用[delegate feetBaby]; 意为让接受了TestDelegate并实现了feetBaby方法的对象来喂孩子

 

Mother.h

#import <Foundation/Foundation.h>
#import "TestDelegate.h"
@interface Mother : NSObject<TestDelegate>
{ }
@property(nonatomic)NSString* name; +(Mother*)initWithName:(NSString*)str;
@end

很明显   在这里  mother这个类  接受了Testdelegate这个代理  注意使用某个代理的形式为 @interface Mother : NSObject<TestDelegate>

Mother.m

#import "Mother.h"

@implementation Mother

@synthesize name;

+(Mother*)initWithName:(NSString *)str
{
Mother* moth = [[Mother alloc]init];
moth.name = str;
return moth;
}
-(void)feetBaby
{
NSLog(@"开始喂孩子了");
}
@end

mother使用了TestDelegate这个代理  所以要实现feetbaby方法,前面说过@requird修饰的方法是必须实现的  要不会报错,@optional修饰的可以选择 实现不实现无所谓,下面看一下怎么main函数的写法

main.m

#import <Foundation/Foundation.h>
#import "Baby.h"
#import "Mother.h"
int main(int argc, const char * argv[]) {
@autoreleasepool {
Baby*baby = [Baby initWithName:@"bob"];
Mother* mot = [Mother initWithName:@"Lily"];
baby.delegate = mot ;
[baby hungry]; }
return ;
}

一定要注意这里 baby.delegate = mot ; 这句代码,实现了baby的代理给了mot。

ios开发:代理设计模式的更多相关文章

  1. IOS开发常用设计模式

    IOS开发常用设计模式 说起设计模式,感觉自己把握不了笔头,所以单拿出iOS开发中的几种常用设计模式谈一下. 单例模式(Singleton) 概念:整个应用或系统只能有该类的一个实例 在iOS开发我们 ...

  2. iOS开发的设计模式

    ios开发学习中,经常弄不清楚ios的开发模式,今天我们就来进行简单的总结和探讨~ (一)代理模式 应用场景:当一个类的某些功能需要由别的类来实现,但是又不确定具体会是哪个类实现. 优势:解耦合 敏捷 ...

  3. 开发必看 | iOS开发常用设计模式!

    ios开发学习中,经常弄不清楚ios的开发模式,今天我们就来进行简单的总结和探讨~(一)代理模式 应用场景:当一个类的某些功能需要由别的类来实现,但是又不确定具体会是哪个类实现.优势:解耦合敏捷原则: ...

  4. iOS开发-代理模式

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

  5. iOS开发_MVC设计模式

    MVC,是一种主流的设计模式,本博文总结一下自己对MVC的看法和理解,浅知拙见,难登大雅之堂,如有欠缺遗漏,还望各位指正. MVC是Model-View-Controller 的缩写,Model 是指 ...

  6. iOS开发——代理与block传值

    一.代理传值的方法 1.Hehe1ViewController.h中 #import <UIKit/UIKit.h> @protocol Hehe1ViewControllerDelega ...

  7. iOS 开发之 设计模式【一】原型模式 (Prototype pattern)

    原型模式(Prototype pattern): 定义:使用原型实例指定创建对象的种类,并通过复制这个原型创建对象.也可以理解为模板,在创建新对象的时候,按照模板的方法来复制,避免重复造轮子. 简单来 ...

  8. IOS开发中的几种设计模式介绍

    ios开发学习中,经常弄不清楚ios的开发模式,今天我们就来进行简单的总结和探讨~ (一)代理模式 应用场景:当一个类的某些功能需要由别的类来实现,但是又不确定具体会是哪个类实现. 优势:解耦合 敏捷 ...

  9. IOS开发中的几种设计模式

    ios开发学习中,经常弄不清楚ios的开发模式,今天我们就来进行简单的总结和探讨~ (一)代理模式 应用场景:当一个类的某些功能需要由别的类来实现,但是又不确定具体会是哪个类实现.优势:解耦合敏捷原则 ...

  10. iOS 开发中常见的设计模式

    最近有小伙伴问到在iOS开发中的几种设计模式,这里摘录一下别人的总结(因为已经感觉总结得差不多了,适用的可以阅读一下) 首先是开发中的23中设计模式分为三大类:1.创建型 2.结构型 3.行为型 (i ...

随机推荐

  1. ADO.NET 快速入门(十二):从 SQL Server 生成 XML 数据

    本文演示如何使用2种不同的方法从 SQL Server 生成 XML.   方法1:使用了 SqlCommand 的 ExecuteXmlReader 方法获取 XmlReader,然后使用 Data ...

  2. Andoird Studio 错误: 非法字符: '\ufeff' 解决方案。

    从网上下载一个安卓UI模板,导入到AndroidStudio的时候提示MainActivity非法字符: '\ufeff' 解决方案,细细一想编译器没报错,但编译出错,应该是隐蔽字符BOM的问题,于是 ...

  3. oracle批量导出AWR报告

    工作需求:项目中需要把生产库中所有的AWR报告dump出来,然后导入到方便测试的数据库中.在测试库中的AWR报告需要根据dbid和实例名逐个导出,如果遇到很多再加上RAC系统,会很麻烦.在网上找了一些 ...

  4. Java中Scanner的使用方法

      Scanner是SDK1.5新增的一个类,但是使用该类创建一个对象.Scanner reader=new Scanner(System.in); 然后reader对象调用下列方法(函数),读取用户 ...

  5. Visio Premium 2010密钥+破解激活方法

    Visio Premium 2010密钥+破解激活方法: 在安装时能够使用下面密钥: GR24B-GC2XY-KRXRG-2TRJJ-4X7DC VWQ6G-37WBG-J7DJP-CY66Y-V27 ...

  6. MySQL Cluster2个数据节点压力测试--mysqlslap工具压400W写

    锅巴哥的个人建议:cluster叫电信运营商版本,所以基本上在很大的用户并发量的情况下才会用到,对连接数的线性增长要求高的场景,千兆就不用想了, 没万兆就不用玩了. 很不幸,我的就是千兆网络,我的数据 ...

  7. SHELL 详解

    http://blog.csdn.net/vah101/article/details/6173488 ( a=2;b=4;c=9; ) 子shell 环境 { a=2;b=4;c=9; } 当前sh ...

  8. cocos2dx libjson

    libjson下载 http://sourceforge.net/projects/libjson/ 下载解压后改名成libjson,用到的是根目录下面的JSONOptions.h.libjson.h ...

  9. ckfinder动态指定上传路径

    默认情况下无法用代码修改config.ascx中的BaseUrl设置,因为其后端代码ConfigFile中并没有提供修改BaseUrl的方法,这里我借用了fckeditor以前的用法:利用sessio ...

  10. 用CAS操作实现Go标准库中的Once

    Go标准库中提供了Sync.Once来实现"只执行一次"的功能.学习了一下源代码,里面用的是经典的双重检查的模式: // Once is an object that will p ...