`
R任轩
  • 浏览: 15861 次
  • 性别: 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;  
}  

 

分享到:
评论

相关推荐

    代理模式详解

    ### 代理模式详解 #### 一、代理模式概述 代理模式是面向对象设计模式中的一种,主要用于当直接访问某个对象时会带来不便或需要增加额外的功能。代理模式通过创建一个对象来控制对另一个对象的访问,它属于结构型...

    CAS代理模式

    **CAS代理模式详解** CAS(Central Authentication Service,中央认证服务)是一种广泛使用的单点登录(Single Sign-On,SSO)协议。它允许用户通过一个入口点登录,然后在整个系统内无需再次验证身份即可访问多个...

    iOS 代理详解Demo

    当一个对象(委托者)需要与另一个对象进行交互,但又不希望两者之间有直接的耦合时,代理模式就派上了用场。代理对象通常负责转发委托者的请求,或者接收委托者的事件通知。 在iOS的UI组件中,例如UITableView和...

    设计模式详解C#

    12. **代理模式**:为其他对象提供一种代理以控制对这个对象的访问。C#中的远程代理和虚拟代理是其典型应用。 13. **命令模式**:将请求封装为一个对象,从而使你可用不同的请求参数化其他对象。C#中的委托和事件...

    C#面向对象设计模式纵横谈 12种设计模式

    本篇将深入探讨12种核心的设计模式,它们是:单例模式、工厂模式、抽象工厂模式、建造者模式、原型模式、适配器模式、装饰器模式、代理模式、桥接模式、组合模式、享元模式和观察者模式。 1. **单例模式**:确保一...

    Java23种设计模式详解

    包括适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式和享元模式。 - **行为型模式**:定义了对象间的职责分配,以及它们如何交互以执行任务。包括策略模式、模板方法模式、观察者模式、迭代子模式...

    c#设计模式详解及其例程

    本资源“c#设计模式详解及其例程”提供了一套全面且深入的C#设计模式分析,旨在帮助初学者和有经验的开发者更好地理解和应用这些模式。 首先,我们要理解什么是设计模式。设计模式并不具体指某段代码,而是描述在...

    Java 23种设计模式16代理模式.pdf

    ### Java设计模式之代理模式详解 #### 模式概述 代理模式是软件设计领域中一种常用的设计模式之一,尤其在面向对象编程语言如Java中应用广泛。代理模式的主要目的是为其他对象提供一种代理以控制对这个对象的访问...

    设计模式详解

    本篇文章将深入探讨“设计模式详解”,特别是针对C#环境的应用。 1. **单例模式**:确保一个类只有一个实例,并提供全局访问点。在C#中,可以使用静态成员或双重检查锁定来实现单例,避免多线程环境下的同步问题。 ...

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

    Java中的代理模式是一种设计模式,它允许我们创建一个代理对象,该对象可以在调用实际对象的方法之前或之后执行额外的操作,而无需修改原始代码。在Java中,代理主要分为静态代理和动态代理。 1. 静态代理: 静态...

    JavaScript事件代理和委托详解

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

    民事诉讼委托代理合同.doc

    【民事诉讼委托代理合同知识点详解】 民事诉讼委托代理合同是当事人在进行民事诉讼时,为了获得专业法律服务,与律师事务所签订的一种法律文件。这份合同明确了律师作为诉讼代理人在诉讼过程中的职责、权限以及双方...

    ios 设计模式

    ### iOS设计模式详解 #### 一、单例模式 单例模式是一种常用的设计模式,它的主要目的是确保一个类仅有一个实例,并且该实例能够被全局访问。这种模式非常适合那些需要频繁访问并保持状态一致的对象,比如全局配置...

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

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

    Java设计模式-图文详解

    ### Java设计模式详解 #### 1. 创建型模式 创建型模式主要关注的是对象的创建方式,它们提供了创建对象的最佳方法。以下是对几种常见的创建型模式的深入解析: ##### 1.1.1 工厂方法(Factory Method) **定义**...

    iOS 代理详解

    代理模式在Objective-C和Swift中广泛应用于事件处理、数据传递等场景。本篇文章将深入探讨iOS代理的使用,包括其原理、实现方式以及常见应用。 首先,代理的基本原理是对象A(委托者)通过遵循特定的协议,声明它...

    最新律师风险代理合同书律师风险委托代理通用版合同WORD范本可编辑.docx

    如果甲方败诉,乙方将不收取代理费,这是一种风险分担的模式。 5. 违约责任:如果甲方违反合同,例如单方面解除合同或未按时支付代理费,需承担违约责任,可能需支付每日的违约金。 6. 合同生效与终止:合同自双方...

    IOS委托机制详解及代码

    在iOS开发中,委托(Delegate)机制是一种非常重要的设计模式,它允许对象间进行通信,尤其是在数据传递和事件处理方面。本文将详细讲解iOS委托机制的原理和使用,并结合具体的代码示例进行解析。 委托机制的核心是...

    代理delegate详解,block,gcd

    它允许一个对象(委托方)向另一个对象(代理对象)发送消息,请求执行特定的操作。代理通常用于处理事件响应、数据传递等场景。设置代理需要遵循某个协议(Protocol),该协议定义了代理需要实现的方法。例如,在...

Global site tag (gtag.js) - Google Analytics