`
R任轩
  • 浏览: 14916 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
文章分类
社区版块
存档分类
最新评论

委托模式(代理模式)详解

阅读更多

什么是委托模式:

      委托delegate是协议的一种,通过一种@protocol的方式来实现。

委托模式的作用:

      我们首先要知道委托模式的作用到底有哪些?理清这个问题,才知道改在什么情况下去用这个delegate。

委托的作用有两个,一个是传值,另一个是传事件

  • 所谓传值就是B类要把自己的一个数据或者对象传给A类,让A类去展示或者处理。
  • 所谓的传事件就是,简单来说假如A类发生某个事件,它本身并不出来,而是通过委托delegate的形式,让它的委托对象B类去处理(委托对象B类就要实现委托中的方法)。

实现委托需要去注意的几点:

  • 需要定义协议@protocol,这个协议可以单独去newfile一个,也可以放在委托对象的头文件里(一般用这个方法)。
  • 在这个协议中定义委托对象需要委托别人处理的一些方法,用于传值或者传事件。
  • 委托类中要定义一个协议的实例对象,属性一般设置为assign(例如:@property (nonatomic,assign)id<MyDelegate> delegate;)
  • 被委托的类中需要在自己的interface中声明协议:<XXXDelegate>,表示该类要实现XXXDelegate协议中的方法。
  • 委托类对象的delegate设置为被委托对象,方法有两种:1.委托类对象.delegate = 被委托对象  2.在被委托类里定义一个委托对象,设置 委托对象.delegate = self.

接下来通过实例来解释两种方法:

1.委托传值

  • 委托类:Customer其中委托协议定义了一个方法,表示Customer要买一个手机,会传递一个手机型号参数,customer通过委托delegate调用这个方法表示customer要买手机。
  • 被委托类:Businessman,其继承这个协议,实现了这个协议中的方法,也即处理了委托类customer要买手机的需要。

Customer.h

@protocol MyDelegate <NSObject>  
  
-(void)buyIphone:(NSString*)iphoneType;  
  
@end  
  
@interface Customer : NSObject  
  
@property(nonatomic,assign)id<MyDelegate> delegate;  
  
-(void)willBuy;  
  
@end  

 Customer.m

@implementation Customer    
  
-(void)willBuy {  
    [delegate buyIphone:@"Iphone6S"];  
}  
  
@end  

 Businessman.h

@interface Businessman : NSObject<MyDelegate>  
  
@end  

 Businessman.m

@implementation Businessman  
  
-(void)buyIphone:(NSString *)iphoneType {  
    NSLog(@"There is an Iphone store,we have %@",iphoneType);  
}  
  
  
@end  

 main.m

int main(int argc, const char * argv[])  
{  
  
    @autoreleasepool {  
        
        Customer *customer = [[Customer alloc]init];          
        Businessman *businessman = [[Businessman alloc]init];  
        customer.delegate = businessman;  
        [customer willBuy];  
    }  
    return 0;  
}  

 2.委托传事件

委托类:Boss 他要处理起草文件和接电话的任务,但是他本身并不实现这些事件响应的方法,而是通过委托让他的被委托类来实现这些响应方法。

被委托类:Secretary 他受Boss的委托实现起草文件和接电话任务的方法。

Boss.h

@protocol MissionDelegate <NSObject>  
-(void)draftDocuments;  
-(void)tellPhone;  
@end  
@interface Boss : NSObject  
@property(nonatomic, assign)id<MissionDelegate> delegate;  
-(void)manage;  
@end  

 Boss.m

@implementation Boss  
-(void)manage {  
    [self.delegate draftDocuments];  
    [self.delegate tellPhone];  
}  
@end  

Secretary.h

@interface Secretary : NSObject <MissionDelegate>  
  
@end  

 Secretary.m

@implementation Secretary  
-(void)draftDocuments {  
    NSLog(@"Secretary draft documents");  
}  
-(void)tellPhone {  
    NSLog(@"Secretary tell phone");  
}  
@end  

 main.m

int main(int argc, const char * argv[])  
{  
    @autoreleasepool {       
        Boss *boss = [[Boss alloc] init];  
        Secretary *secretary =  [[Secretary alloc] init];  
        boss.delegate = secretary;  
        [boss manage];  
    }  
    return 0;  
}  

 

分享到:
评论

相关推荐

    java静态代理和动态代理详解

    在代理模式中,主要有两种类型:静态代理和动态代理。 1.静态代理: 静态代理是指在编译期间就已经确定代理类和被代理类的关系,需要手动编写代理类。代理类需要实现与被代理类相同的接口,并且在代理类中持有一个被...

    JavaScript事件代理和委托详解

    在javasript中,代理、委托经常出现。 那么它究竟在什么样的情况下使用?它的原理又是什么? 这里介绍一下javascript delegate的用法和原理,以及Dojo,jQuery等框架中delegate的接口。 JavaScript事件代理 事件代理...

    详解Observer Pattern(观察者模式)在Java中的使用原理

    对于C#的委托、代理概念所使用的Callback(回调模式--参见本人的“第一个C#程序Hello World ”资源)来看,Java Swing编程是纯粹的OO语言、是一种非常优雅的编程语言(本人认为)--而C#的学习好像非常强调所谓的OO思想...

    asp.net知识库

    2分法-通用存储过程分页(top max模式)版本(性能相对之前的not in版本极大提高) 分页存储过程:排序反转分页法 优化后的通用分页存储过程 sql语句 一些Select检索高级用法 SQL server 2005中新增的排序函数及应用 ...

    利用C#实现AOP常见的几种方法详解

    AOP为Aspect Oriented Programming的缩写,意为:面向切面编程,通过预编译方式和运行期动态代理实现程序功能的中统一处理业务逻辑的一种技术,比较常见的场景是:日志记录,错误捕获、性能监控等 AOP的本质是通过...

    Web-front-end-knowledge-summary:前端知识点总结

    JavaScript基础DOM(文档对象模型)JavaScript 基本数据类型和引用数据类型JS数据类型判断事件冒泡和事件捕获js中的事件委托或事件代理详解DOM 事件模型JS函数防抖和函数节流JavaScript 设计模式跨域解决方案页面间...

    庖丁解牛:纵向切入ASP.NET 3.5控件和组件开发技术

    5.3.2 定制自己的委托和事件参数类 170 5.3.3 复合控件的事件处理 175 5.3.4 自动完成功能控件searchcontrolintelligent 185 5.4 本章总结 193 第6章 页面状态机制 194 6.1 页面状态概述 194 6.2 视图状态机制...

    庖丁解牛纵向切入ASP.NET 3.5控件和组件开发技术.pdf

    5.3.2 定制自己的委托和事件参数类170 5.3.3 复合控件的事件处理175 5.3.4 自动完成功能控件searchcontrolintelligent185 5.4 本章总结193 第6章 页面状态机制194 6.1 页面状态概述194 6.2 视图状态机制195 ...

    庖丁解牛 纵向切入ASP.NET 3.5控件和组件开发 part1

    16.4.4 使用代理实现ajax调用服务端示例 581 16.5 ajax library对控件客户端类开发的支持 584 16.5.1 客户端控件基成员(类/接口) 584 16.5.2 asp.net ajax控件客户端生命周期 589 16.6 客户端控件示例应用 592...

    庖丁解牛 纵向切入ASP.NET 3.5控件和组件开发 part2

    16.4.4 使用代理实现ajax调用服务端示例 581 16.5 ajax library对控件客户端类开发的支持 584 16.5.1 客户端控件基成员(类/接口) 584 16.5.2 asp.net ajax控件客户端生命周期 589 16.6 客户端控件示例应用 592...

    python入门到高级全栈工程师培训 第3期 附课件代码

    05 jquery事件绑定与事件委托 06 jquery动画效果 07 jquery扩展与插件 08 jquery扩展补充 09 本周作业轮播图以及思路 第45章 轮播图片css部分 轮播图片js部分 第46章 01 数据库与dbms的概念 02 sql规范 03 ...

Global site tag (gtag.js) - Google Analytics