美文网首页Objective-C
代理设计模式

代理设计模式

作者: 越天高 | 来源:发表于2019-02-25 22:33 被阅读1次

    1.代理设计模式

    • 什么是设计模式
      • 设计模式(Design pattern)是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性。毫无疑问,设计模式于己于他人于系统都是多赢的;设计模式使代码编制真正工程化;设计模式是软件工程的基石脉络,如同大厦的结构一样。
    • 什么是代理设计模式
      • 生活中大家一定遇到这样的情况了:比如说我要买一包纸,不妨就是心相印的吧,那一般人的话我应该不是去心相印的工厂里面直接去买吧,而是我们在心相印专卖店或者什么超市啊,这些地方购买,这些地方实际上就是洁丽雅毛巾的代理。这其实和我们OO中的代理模式是很相似的。
    • 代理设计模式的场合:
      • 当对象A发生了一些行为,想告知对象B(让对象B成为对象A的代理对象)
      • 对象B想监听对象A的一些行为(让对象B成为对象A的代理对象)
      • 当对象A无法处理某些行为的时候,想让对象B帮忙处理(让对象B成为对象A的代理对象)

    2.代理设计模式示例

    • 婴儿吃饭睡觉
    // 协议
    #import <Foundation/Foundation.h>
    @class Baby;
    
    @protocol BabyProtocol <NSObject>
    - (void)feedWithBaby:(Baby *)baby;
    - (void)hypnosisWithBaby:(Baby *)baby;
    @end
    
    #import "BabyProtocol.h"
    @interface Baby : NSObject
    // 食量
    @property (nonatomic, assign) int food;
    // 睡意
    @property (nonatomic, assign) int drowsiness;
    // 饿
    - (void)hungry;
    // 睡意
    - (void)sleepy;
    @property (nonatomic, strong) id<BabyProtocol> nanny;
    @end
    
    @implementation Baby
    
    - (void)hungry
    {
        self.food -= 5;
        NSLog(@"婴儿饿了");
        // 通知保姆
        if ([self.nanny respondsToSelector:@selector(feedWithBaby:)]) {
            [self.nanny feedWithBaby:self];
        }
    }
    
    - (void)sleepy
    {
        self.drowsiness += 5;
        NSLog(@"婴儿困了");
        // 通知保姆
        if ([self.nanny respondsToSelector:@selector(hypnosisWithBaby:)]) {
            [self.nanny hypnosisWithBaby:self];
        }
    }
    @end
    
    // 保姆
    @interface Nanny : NSObject <BabyProtocol>
    @end
    
    @implementation Nanny
    
    - (void)feedWithBaby:(Baby *)baby
    {
        baby.food += 10;
        NSLog(@"给婴儿喂奶, 现在的食量是%i", baby.food);
    }
    
    - (void)hypnosisWithBaby:(Baby *)baby
    {
        baby.drowsiness += 10;
        NSLog(@"哄婴儿睡觉, 现在的睡意是%i", baby.drowsiness);
    }
    @end
    
    • 有一个婴儿,他本身不会自己吃饭和洗澡等等一些事情,于是婴儿就请了一个保姆,于是婴儿和保姆之间商定了一个协议,协议中写明了保姆需要做什么事情,而保姆就是这个代理人,即:婴儿和保姆之间有个协议,保姆遵守该协议,于是保姆就需要实现该协议中的条款成为代理人

    3.代理设计模式练习

    • 学生通过中介找房子的过程,学生不知道怎么找所以让代理帮忙找
    • 协议的编写规范:
      1.一般情况下, 当前协议属于谁, 我们就将协议定义到谁的头文件中
      2.协议的名称一般以它属于的那个类的类名开头, 后面跟上protocol或者delegate
      3.协议中的方法名称一般以协议的名称protocol之前的作为开头
      4.一般情况下协议中的方法会将触发该协议的对象传递出去

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

    6.当某一个类要成为另外一个类的代理的时候,
    一般情况下在.h中用@protocol 协议名称;告诉当前类 这是一个协议.
    在.m中用#import真正的导入一个协议的声明

    @class Person;
    
    @protocol PersonProtocol <NSObject>
    
    - (void)personFindHourse:(Person *)person;
    
    @end
    
    @interface Person : NSObject
    
    //@property (nonatomic, strong) id<StudentProtocol> delegete;
    @property (nonatomic, strong) id<PersonProtocol> delegate;
    
    - (void)findHourse;
    @end
    
    #import "Person.h"
    
    @implementation Person
    
    - (void)findHourse
    {
        NSLog(@"学生想找房子");
        // 通知代理帮他找房子
        if ([self.delegate respondsToSelector:@selector(personFindHourse:)]) {
            [self.delegate personFindHourse:self];
        }
    }
    
    @end
    

    代理的代码:

    #import <Foundation/Foundation.h>
    #import "Person.h"
    
    //@protocol PersonProtocol;
    
    @interface LinkHome : NSObject <PersonProtocol>
    
    @end
    
    #import "LinkHome.h"
    
    @implementation LinkHome
    
    - (void)personFindHourse:(Person *)person
    {
        NSLog(@"%s", __func__);
    }
    @end
    
    结果
    学生想找房子
    [LinkHome personFindHourse:]
    

    相关文章

      网友评论

        本文标题:代理设计模式

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