zoukankan      html  css  js  c++  java
  • IOS代理

    之前看过一些关于代理的资料,始终感觉还是很模糊,最近抽出一段空闲的时间,将这块内容整理下:

    什么是代理,顾名思义就是帮别人做些事情,比如买房子,当我们买房子时,我们一般会找房屋中介,因为他们就是干这件事情,他们比我们普通人在这方面了解的多,此时房屋中介就是我们所谓的代理,他们将会提供买房者所需的资料,比如房屋的价格,房屋的面积等信息,根据以上环境我们开始编码,实现通过代理模式实现以上功能。

    简单的代理实现:

    1.代理,听到这个词我们很明确知道我们需要两个主角(1)买房子的人(person)(2)房子中介(medium),房子中介需要做我们的代理,帮我们处理一些事物,知道这些首先定义两个类:

    Person类

    #import <Foundation/Foundation.h>
    #import "Medium"
    
    @interface Person : NSObject
    
    @property(nonatomic,retain) Medium *delegate;
    // 买房    
    - (void)buyHome;
    
    @end
    
    @implementation Person
    
    - (void)buyHome
    {
      double price = [_delegate homePrice];
      double size  = [_delegate homeSize];
      NSLog(@"房屋中介反馈:  房子价格:%f  房屋面积:%f",price,size);
    }
    
    - (void)dealloc
    {
      // 成员变量用到retain关键字,必须在dealloc中销毁一次,这块不详细讲内存管理。
        [_delegate replease];
        [super dealloc];
    }
    
    @end

    NOTE

    person类都做了什么?

    1):买房者需要买房,那我们必须提供一个买房的方法,buyHome()。

    2):买房必须知道房屋的面积以及价格,这些信息必须通过房屋中介获取,因此我们需要将房屋中介引入到Person类中。

    Medium类

    #import <Foundation/Foundation.h>
    
    @interface Medium : NSObject
    
    // 房子的价格
    - (double)homeCost;
    
    // 房子大小
    - (double)homeSize;
    
    @end
    
    @implementation Medium
    
    // 房子的价格
    - (double)homeCost;
    {
        return 1000000;
    }
    
    // 房子大小
    - (double)homeSize
    {
        return 98;
    }
    
    @end

    NOTE

    medium类做了什么?

    1):房屋中介需要从买房者哪里获取到房屋面积,以及出售的价格,以提供给买房者。

    main类

    #import <Fundation/Foundation.h>
    #import "Person"
    #import "Medium"
    
    int main(int argv,const char* argc[])
    {
    
        @autoreleasepool
        {
            Person *person = [[[Person alloc]init]autorelease];
            Medium *medium = [[[Medium alloc]init]autorelease];
            
            // person获取中介的实例对象
            person.delegate = medium;
            
            // 中介提供房子的详细情况        
            [person buyHome];
        }
        return 0;
    }

    流程图:(以下流程图是一个完整买房流程)

     根据这个流程图我们再分析下买房这个过程:

    1)房屋中介通过自己方式获取到卖方者的一切属性,比如房屋的价格,房屋的面积,房屋的地理位置。

    2)房屋中介提供房源信息给买房者。

    3)买房者决定最终是否购买房子。

    这个流程图中我们只需要关注橙色区域的对象,买房者和房屋中介。

    买房者:中介我想了解下现有房源的价格,面积,地址。

    中介:我们这里现在有100*100m,价格在200W的房子,地址在上海泗泾,你看是否需要。

    买房者:这套房子还不错,考虑下,还有其他选择嘛。

    中介:必须有……。

    正直意义的代理:

    以上是一个简单的代理模式,买房者无需通过卖方者的获取房屋信息,一家一家问太累了,直接问中介多省事,但是有个问题,如果买房者把这件事情和其他人交流了下,其中有人说,这家中介太黑了,收取的中介费比其他中介高的高,此刻怎么办,最简单的方式就是换另外一家中介,那程序中又是如何实现。

    分析:

    此刻我们需要把那家中介(medium)从我们的person类中剔除,person需要一个动态的中介,可以选择的中介。

    如果是这样,我们就必须定义协议,如果那个中介想申请当我的代理,那就必须遵守我们的协议,不然我就不考虑,那我协议中都定义什么方法了,和上面的方法一样,一个是房子的价格,一个是房子的面积。

    协议的定义:

    @protocol BuyHomeDelegate : NSObject
    
    // optional 中定义的方法是可选择性的实现
    @optional
    
    
    // required 中定义的方法必须实现
    @required
    - (double)homePrice;
    - (double)homeSize;
    
    @end

    person+medium类 (以下代码,改变了细节性的地方,用粗体标识,目的是不依赖具体某一个代理,而是接受我的协议,便可做我的代理)

    #import <Foundation/Foundation.h>
    #import "Medium"
    #import "BuyHomeDelegate"
    
    @interface Person : NSObject
    
    @property(nonatomic,retain) id<BuyHomeDelegate> delegate;
    // 买房    
    - (void)buyHome;
    
    @end
    
    @implementation Person
    
    - (void)buyHome
    {
      double price = [_delegate homePrice];
      double size  = [_delegate homeSize];
      NSLog(@"房屋中介反馈:  房子价格:%f  房屋面积:%f",price,size);
    }
    
    - (void)dealloc
    {
      // 成员变量用到retain关键字,必须在dealloc中销毁一次,这块不详细讲内存管理。
        [_delegate replease];
        [super dealloc];
    }
    
    @end
    
    #import <Foundation/Foundation.h>
    #import "BuyHomeDelegate"
    @interface Medium : NSObject <BuyHomeDelegate>
    
    // 房子的价格
    - (double)homeCost;
    
    // 房子大小
    - (double)homeSize;
    
    @end
    
    @implementation Medium
    
    // 房子的价格
    - (double)homeCost;
    {
        return 1000000;
    }
    
    // 房子大小
    - (double)homeSize
    {
        return 98;
    }
    
    @end
    
    #import <Fundation/Foundation.h>
    #import "Person"
    #import "Medium"
    
    int main(int argv,const char* argc[])
    {
    
        @autoreleasepool
        {
            Person *person = [[[Person alloc]init]autorelease];
            Medium *medium = [[[Medium alloc]init]autorelease];
            
            // person获取中介的实例对象
            person.delegate = medium;
            
            // 中介提供房子的详细情况        
            [person buyHome];
        }
        return 0;
    }

    流程图:(以下流程图是一个完整买房流程)

     补充一点:以上代码纯手工打造,无污染绿色环保,可能会有小问题,需要调试。

    总结:第一个简单的代理和第二个真正意义的代理,思想都是相同的,第一个为了说明代理的问题,第二个是在实际开发中运用的,最后也请各位朋友多提问题,以及后续的交流:IOS技术探讨交流

  • 相关阅读:
    负载均衡器部署方式和工作原理
    Android 有关于* daemon not running.starting it now on port 5037 *ADB
    微信开发常用文档及参考资料
    XML解析之sax解析案例(二)使用sax解析把 xml文档封装成对象
    XML解析之sax解析案例(一)读取contact.xml文件,完整输出文档内容
    XML解析之SAX解析过程代码详解
    通过PHP current()函数获取未知字符键名数组第一个元素的值
    PHP检测链接是否是SSL连接 ,也就是判断HTTPS
    PHP反射ReflectionClass、ReflectionMethod 入门教程
    PHP 反射API说明
  • 原文地址:https://www.cnblogs.com/daojiao/p/4652089.html
Copyright © 2011-2022 走看看