Object-c和Java中的代理

时间:2022-08-31 07:53:29

代理模式的核心思想就是一个类想做一件事情(函数),但它不去亲自做(实现),而是通过委托别的类(代理类)来完成。

代理模式的优点:

1.可以实现传值,尤其是当一个对象无法直接获取到另一个对象的指针,又希望对那个变量进行一些操作时。(这点在ios里面应用颇多)

2.实现了代码的解耦。可以对外提供接口,具体的工作由不同的客户来决定怎么做。

 

代理模式在java和ios编程中经常使用,下面分别二者进行说明。

IOS的代理模式,分两步:

1.在委托类A声明一个代理和一个协议,协议里有个方法的声明(由代理来实现)。这样这个类就可以在自己内部调用[mDelegate dosomething:(param) p]来实现要做的东西。

    @protocal MyDelegate

    -(void)dosomething:(param)p;

    @end

    @interface MyClass ::NSObject

    @property(strong, nanotomic) (id)MyDelegate mDelegate;

      ......

    [mDelegate dosomething:(param)p          //调用代理做事情

2.设置代理,在代理类里,首先声明自己是A类的代理,即在interface后面加上<代理协议>。然后设置A的代理为自己:mA.mDelegate=self。然后去实现协议方法dosomething(param p)。

    @interface Proxy::NSObject<MyDelegate>

    (MyClass) mA;

    @end

    @implementation  

    mA.mDelegate=self;

    .....@end

 

Java的代理模式

思路跟IOS的相似,据说代理模式有很多种,这里写了个我理解的代理模式的例子:有三个关键角色:委托类:Request,代理类:Proxy,接口MyInterface

接口:里面有一个方法,处理数据Process()

1 public Interface MyInterface{
2     int Process(int a);
3     
4 }

委托类:

 1  public class Request{
 2  
 3      int data=1;
 4      Proxy mProxy;
 5  
 6      public Request(Proxy p){
 7      this.mProxy=p;                //通过构造函数传入代理p
 8 
 9     }
10  
11      public int ProcessData(){
12          return mProxy.Process(data);       //在这里调用代理来做Process这个事情
13     }
14 
15     public static void Main(string args[]){
16         //实例化代理类和委托类
17         Proxy mProxy=new Proxy();
18         Request mRequest=new Request(mProxy);
19         //输出协议方法的结果
20         int result=mRequest.ProcessData();
21         System.out.println(result);
22     }
23  
24   }

代理类:

1 public Class Proxy implements MyInterface{
2    ....
3     public int Process(int a){       
4         return 10*a;            //实现协议方法
5     }    
6 }

这样Proxy就替Request完成了ProcessData的任务,这里面代理类相当于客户,不同的客户可以有不同的处理a的方法。这里的代理是对a乘以了10.

这里Process()就是服务端给客户端提供的接口,即把数据a暴露出来,由客户来决定怎么对a进行处理。

最后打印的结果为10

 

理解代理模式的关键:

1.从委托类角度上考虑:

委托类为什么要让别的类来代替自己做这件事?因为委托类有个东西需要别人做,但是不知道具体给谁做(有很多客户),所以干脆把这个接口扔出去,谁用的时候自己实现该方法就行了。

2.从代理类角度考虑:

虽然委托类“委托别人做事”,真正将客户提出的功能进行了落实的是委托类。客户既然成为客户,他是有需求的,需求是什么?就是协议方法的实现。客户的需求通过代理模式传入到委托类这里,从而实现客户的要求。

形象的说:委托类要做一件很厉害的事情,但是其中有一小部分需要根据不同的客户来填写响应的需求,这个需求就是对代理类(客户)暴露的接口,客户实现了这个接口以后委托类就可以把这个很厉害的事情做完了,最终得到客户想要的结果。