Proxy(代理模式)

定义:provide a surrogate or placeholder for another object to control access to it

           为其他对象提供一种代理以控制对这个对象的访问

          代理模式其实很简单,只是我一直不明白为什么要这样做

          我们同样以一个问题引入,比如 我们有一个叫做Server的类,这个类提供一个叫做getData的方法,该方法返回给用户一些数据,简单起见,就返回一个int类型的1好了。

#import <Foundation/Foundation.h>

@interface Server : NSObject

-(int) getData;

@end

#import "Server.h"

@implementation Server

-(int) getData
{
    return 1;
}

@end

客户端调用的时候就需要这样

    Server* server=[[Server alloc] init];
    [server getData];

好了 这其实很棒,但是 现在我想在Server中间插入一个代理,控制你对Server的访问,于是 我对Server重新调整一下,添加一个叫做AbstractServer的类,这个类提供一个抽象方法叫做getData,然后让Server去继承这个类,同时,我创建一个新的类叫做 ServerProxy,这个类继承AbstractServer类,代码如下

#import <Foundation/Foundation.h>

@interface AbstractServer : NSObject

-(int) getData;

@end
这是一个抽象类

#import "AbstractServer.h"

@interface Server : AbstractServer

@end

#import "Server.h"

@implementation Server

-(int) getData
{
    return 1;
}

@end

Server的继承变了,继承自AbstractServer


#import "AbstractServer.h"

@interface ServerProxy : AbstractServer

@property (nonatomic,strong) AbstractServer* server;    //这里添加一个调用对象是AbstractServer 目的是可能多重代理

@end


#import "ServerProxy.h"
#import "Server.h"

@implementation ServerProxy

@synthesize server=_server;

-(AbstractServer*) server   //为server创建一个默认的代理
{
    if (_server==nil)
    {
        _server=[[Server alloc] init];
    }
    return _server;
}

-(int) getData
{
    return [self.server getData];
}

@end



好了 这时候客户端调用就变了,变成这样

    ServerProxy* proxy=[[ServerProxy alloc] init];
    [proxy getData];                                //直接使用默认代理的server访问

这样 我们在真正的Server中插入了一个代理,然后让代理去访问Server获取data。

这就是Proxy模式

到这里 你一定会疑惑。。这到底有什么用,为什么要再中间插入这一层,其实 我当初也由这个疑惑   

       你可以这样想,比如 在天朝,我想访问facebook,我是不是要用代理,因为我会被天朝拦截,那同样,在我看来 你换到你的代码中也一样,或许你不想让这个类有这个权限,因为你想做到类的单一职责原则。这是其一

        其二,你的代理模式的getData可以变成这样

-(int) getData
{
    //do something
    return [self.server getData];
}

 多了一个do something,do something可以去判断访问server的权限,这样能够更好的控制Server的访问,这就是我认为为什么要加入代理模式的原因了

好了 我们回到定义  其实就是为Server提供一个代理叫做ServerProxy,然后这两个同样类具有共同的接口,同时借助代理 我们控制了对Server的访问,这就是代理模式


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值