zoukankan      html  css  js  c++  java
  • Objective-c 代理模式

    一·什么事代理模式?

          代理模式是在oc中经常遇到的一种设计模式,那什么叫做代理模式呢? 举个例子:有一租客, 他要租房子,可是他不知道哪儿有房子可租,于是他就找了中介,让中介去帮他找房子,于是他和中介之间商定了一个协议,协议中写明了中介需要做的事情是帮他找房子, 而中介就成为了租客的代理人,  即:他和中介之间有个协议,中介继承该协议,于是中介就需要实现该协议中的条款成为代理人。

    二、 代理模式的关键点:
         A完成一件事,但是自己不能完成,于是他找个代理人B 替他完成这个事情,他们之间便有个协议 (protocol),B继承该协议来完成A代理给他的事情。 
     
    三、实例分析
          下面来例举一个例子,学生与中介的例子,学生委托中介帮助租房子。
           1.首先学生和中介要有协议,协议如下:
            建立协议文件.h的步骤:
           快捷键Command+n将出现一个界面,选择Objective-C File—>Next 在下一个界面中在File栏中写StudentProtocol,在File Type中选择Protocol然后回车,协议的文件就建立好了
          在StudentProtocol.h文件中
    1 #import <Foundation/Foundation.h>
    2 
    3 @protocol StudentProtocol <NSObject>
    4 /*
    5    协议要做的事儿
    6    帮学生找房子
    7  */
    8 -(void)studentFindHourse;
    9 @end

           2,再次声明Intermediary(中介)类,即代理的人:

         在Intermediary.h文件中

    #import <Foundation/Foundation.h>
    #import "StudentProtocol.h"
    @interface Intermediary : NSObject<StudentProtocol>//实现该协议
    
    @end

         3.中介要干的事儿,实现文件,在Intermediary.m文件中

    #import "Intermediary.h"
    
    @implementation Intermediary
    -(void)studentFindHourse
    {
        NSLog(@"%s 帮学生找房子",__func__); //__func__输出中介的名称
    }
    @end

         4.在声明一个Student类

           在Student.h文件中

    #import <Foundation/Foundation.h>
    #import "StudentProtocol.h"
    @interface Student : NSObject
    
    -(void)findHourse;//找房子的方法
    
    @property(assign,nonatomic)id <StudentProtocol> delegate;
    @end

        5.在在Student.m文件中

    #import "Student.h"
    
    @implementation Student
    -(void)findHourse
    {
        NSLog(@"学生要找房子");
        //通知代理帮他找房子

    if([self.delegate respondsToSelector:@selector(studentFindHourse)]) { [self.delegate studentFindHourse]; } } @end

        6.在main文件中

    #import <Foundation/Foundation.h>
    #import "Student.h"
    #import "Intermediary.h"
    #import "Intermediary1.h"
    int main(int argc, const char * argv[]) {
        @autoreleasepool {
          Student *stu=[Student new];
          Intermediary *inter=[Intermediary new];
          stu.delegate=inter;
          [stu findHourse];
            
        }
        return 0;
    }

        7.运行结果

    2016-03-01 21:26:41.375 代理模式[2672:236249] 学生要找房子
    2016-03-01 21:26:41.377 代理模式[2672:236249] -[Intermediary studentFindHourse] 帮学生找房子
    Program ended with exit code: 0

          代理中,需要记住的关键是在发出代理请求的类(A)中声明代理人(B)的实例变量,这样就可以保证A 能通过调用B中B代理的方法来完成B代理的事情,即自己代理给B 的事情。

           
  • 相关阅读:
    「SHOI2015」脑洞治疗仪
    LOJ 数列分块入门 8
    CF932F Escape Through Leaf
    NOIP2021游记总结
    [HEOI2016/TJOI2016]序列
    【模板】动态树(Link Cut Tree)
    LG P2839 [国家集训队]middle
    JZOJ 7377.欢乐豆
    JZOJ 7392. 【2021.11.17NOIP提高组联考】数 (ds)
    LOJ 数列分块入门 6
  • 原文地址:https://www.cnblogs.com/zhaochaobin/p/5232601.html
Copyright © 2011-2022 走看看