Object-C篇-设计模式之代理

作者: TianTianBaby223 | 来源:发表于2018-10-05 10:11 被阅读30次

    一 : 代理设计模式简述

    自己做不了的事情,教给别人帮你完成,并且,完成的那个结果返还给你.这个就是代理,举一个简单的小例子 : 假如足球明星C罗去参加一些商务活动,但是C罗所具有的能力只有足球踢得好,,有魅力这写,不会管安排酒店,安排飞机,安排安保,安排活动进程这些东西.这时候需要一个代理人,帮助C罗去完成这些琐事的东西,接下来看看,如何用代码实现这一场景.

    二 : 代理设计模式应用场景

    • 当对象A发生了一些行为,想告知对象B(让对象B成为对象A的代理对象)
    • 对象B想监听对象A的一些行为(让对象B成为对象A的代理对象)
    • 当对象A无法处理某些行为的时候,想让对象B帮忙处理(让对象B成为对象A的代理对象)

    三 : 设计并书写C罗的代理

    定义C罗最近想做的事情

    @interface CRonaldo : NSObject
    
    //relax
    -(void)releax;
    
    //电视演出
    -(void)TVShow;
    
    @end
    
    @implementation CRonaldo
    -(void)TVShow{
        NSLog(@"C罗进行节目录制");
    }
    
    -(void)releax{
        NSLog(@"C罗在夏威夷海滩和妻子吹风");
    }
    @end
    

    需要一个人来帮助自己去安排一下出演,和假期但是C罗身份在那摆着呢,这种事情不能自己做,这里要安排一个助手也就是代理在这里.

    @interface Assistant : NSObject
    
    @end
    

    定义一个协议,那种人才有资格当这个助手呢,简单一,具有安排演出和安排假期能力的人能当上这个助手,定义一个协议,协议内容为安排假期和安排演出

    @protocol AssistantProtocol <NSObject>
    //安排演出
    -(void)playTvShow;
    
    //安排假期
    -(void)playHoliday;
    @end
    

    让我们助手遵守这些协议

    #import "AssistantProtocol.h"
    
    @interface Assistant : NSObject<AssistantProtocol>
    
    @end
    
    
    @implementation Assistant
    -(void)playTvShow{
        NSLog(@"预定飞机票");
        NSLog(@"排除车子");
        
        
        
    }
    
    - (void)playHoliday{
        NSLog(@"安排假期时间");
        NSLog(@"准备旅行用品,和居住酒店")
        
        
    }
    

    助手的条件,现在已经搞定了,我们现在去给C罗安排这么一个人来做这些事情

    @interface CRonaldo : NSObject
    
    //relax
    -(void)releax;
    
    
    //电视演出
    -(void)TVShow;
    
    @property(nonatomic,weak)id<AssistantProtocol> assisDegate;
    
    @end
    
    #import "CRonaldo.h"
    
    @implementation CRonaldo
    -(void)TVShow{
        if ([self.assisDegate respondsToSelector:@selector(playTvShow)] ) {
            [self.assisDegate playTvShow];
        }
        NSLog(@"C罗进行节目录制");
    }
    
    -(void)releax{
        if ([self.assisDegate respondsToSelector:@selector(playHoliday)] ) {
            [self.assisDegate playHoliday];
        }
        NSLog(@"C罗在夏威夷海滩和妻子吹风");
    }
    

    到现在为止呢,安排等琐碎的小事就算安排出去了,毕竟大明星都有自己的助理,接下来测试一下

     //创建助手一位
        Assistant *assis = [[Assistant alloc]init];
        
        //请出我们的球星C罗
        CRonaldo *ron = [[CRonaldo alloc]init];
        
        //给C罗安排助手
        ron.assisDegate = assis;
        
        //协助C罗完成 度假 和 演出
        [ron TVShow];
        [ron releax];
    

    打印结果


    打印结果

    四 : 实际开发中的代理

    • 一般情况下, 当前协议属于谁, 我们就将协议定义到谁的头文件中

    • 协议的名称一般以它属于的那个类的类名开头, 后面跟上protocol或者delegate

    • 协议中的方法名称一般以协议的名称protocol之前的作为开头

    • 一般情况下协议中的方法会将触发该协议的对象传递出去

    • 一般情况下一个类中的代理属于的名称叫做 delegate

    我们根据这些小小的建议在来修改一下C罗助手的书写方式

    #import <Foundation/Foundation.h>
    @protocol AssistantProtocol <NSObject>;
    //安排演出
    -(void)playTvShow;
    
    //安排假期
    -(void)playHoliday;
    
    @end
    
    
    @interface CRonaldo : NSObject
    
    //relax
    -(void)releax;
    
    
    //电视演出
    -(void)TVShow;
    
    @property(nonatomic,weak)id<AssistantProtocol> assisDegate;
    
    @end
    

    相关文章

      网友评论

        本文标题:Object-C篇-设计模式之代理

        本文链接:https://www.haomeiwen.com/subject/mswgnftx.html