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

代理模式的优点:

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()

 public Interface MyInterface{
     int Process(int a);

 }

委托类:

 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   }

代理类:

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

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

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

最后打印的结果为10

理解代理模式的关键:

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

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

2.从代理类角度考虑:

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

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

Object-c和Java中的代理的更多相关文章

  1. java中Proxy(代理与动态代理)

    转自: https://blog.csdn.net/pangqiandou/article/details/52964066 一.代理的概念 动态代理技术是整个java技术中最重要的一个技术,它是学习 ...

  2. (转)轻松学,Java 中的代理模式及动态代理

    背景:讲到反射机制,肯定会想到动态代理. 轻松学,Java 中的代理模式及动态代理 代理模式可以在不修改被代理对象的基础上,通过扩展代理类,进行一些功能的附加与增强.值得注意的是,代理类和被代理类应该 ...

  3. java中动态代理的实现

    动态代理的实现 使用的模式:代理模式. 代理模式的作用是:为其他对象提供一种代理以控制对这个对象的访问.类似租房的中介. 两种动态代理: (1)jdk动态代理,jdk动态代理是由Java内部的反射机制 ...

  4. java中动态代理实现机制

    前言: 代理模式是常用的java设计模式,它的特征是代理类与委托类有同样的接口,代理类主要负责为委托类预处理消息.过滤消息.把消息转发给委托类,以及事后处理消息等.代理类与委托类之间通常会存在关联关系 ...

  5. Java中的代理模式

    代理模式在Java Web的框架中经常使用到.比如说在对数据库的访问中,核心功能是对数据库的增删改查,而连接数据库.处理事务等功能我们在开发中也要考虑到.所以我们将数据库的CRUD抽象到接口中,然后实 ...

  6. java中静态代理,动态代理知识的补充

    文章转载自:http://blog.csdn.net/jialinqiang/article/details/8950989 一.Java动态代理 相对于静态代理的代理类在编译时生成(.class文件 ...

  7. java中静态代理跟动态代理之间的区别

    文章转载于:http://www.cnblogs.com/xiaoluo501395377/p/3383130.html 在学习Spring的时候,我们知道Spring主要有两大思想,一个是IoC,另 ...

  8. java中动态代理

    一.在java中怎样实现动态代理 1.我们要有一个接口,还要有一个接口的实现类,而这个实现类呢就是我们要代理的对象 接口: package org.dynamicproxy.test; public ...

  9. JAVA中的代理技术(静态代理和动态代理)

    最近看书,有两个地方提到了动态代理,一是在Head First中的代理模式,二是Spring AOP中的AOP.所以有必要补充一下动态代理的相关知识. Spring采用JDK动态代理和CGLib动态代 ...

  10. 深入理解JAVA中的代理模式

    前言 代理是什么 事故现场:我家的宠物今天生病了,而我又没有相关的医学知识,所以我只让我的宠物多喝热水吗? 结果显然是不行的,所以我需要去找宠物医生这些更专业的人来帮我的宠物治病. 这个时候,代理就出 ...

随机推荐

  1. hive架构原理简析-mapreduce部分

    整个处理流程包括主要包括,语法解析(抽象语法树,AST,采用antlr),语义分析(sematic Analyzer生成查询块),逻辑计划生成(OP tree),逻辑计划优化,物理计划生成(Task ...

  2. SpringCloud(六) Hystrix入门

    前提 一个可用的Eureka注册中心(文中以之前博客中双节点注册中心,不重要) 一个连接到这个注册中心的服务提供者 快速入门 项目搭建 搭建一个新maven项目,artifactid为Ribbon-c ...

  3. [整理]基于bootstrap的文本编辑器

    http://www.bootcss.com/p/bootstrap-wysiwyg/ http://jhollingworth.github.io/bootstrap-wysihtml5/ http ...

  4. 你知道吗?10个精妙的 Java 编码最佳实践

    这是一个比Josh Bloch的Effective Java规则更精妙的10条Java编码实践的列表.和Josh Bloch的列表容易学习并且关注日常情况相比,这个列表将包含涉及API/SPI设计中不 ...

  5. 20145209 2016-2017-2 《Java程序设计》第7周学习总结

    20145209 2016-2017-2 <Java程序设计>第7周学习总结 教材学习内容总结 read()每次读入一个字节. eg:short2个字节,2=0x0201,读入后要0x & ...

  6. Unity 3(二):Unity在AOP方面的应用

    本文关注以下方面(环境为VS2012..Net Framework 4.5以及Unity 3): AOP简介: Interception using Unity示例 配置文件示例 一.AOP简介 AO ...

  7. oracle主键约束、唯一键约束和唯一索引的区别

    (1)主键约束和唯一键约束均会隐式创建同名的唯一索引,当主键约束或者唯一键约束失效时,隐式创建的唯一索引会被删除: (2)主键约束要求列值非空,而唯一键约束和唯一索引不要求列值非空: (3)相同字段序 ...

  8. 【codeforces】【比赛题解】#862 CF Round #435 (Div.2)

    这次比赛打得很舒服,莫名得了个Rank41,涨了219的Rating,就比较优秀.不过还是没有闫神厉害啊.题目链接::P. [A]MEX 题意: Evil博士把Mahmoud和Ehab绑架到了邪恶之地 ...

  9. Group Normalization笔记

    作者:Yuxin,Wu Kaiming He 机构:Facebook AI Research (FAIR) 摘要:BN是深度学习发展中的一个里程碑技术,它使得各种网络得以训练.然而,在batch维度上 ...

  10. 006_Mac下sublime text 的“package control”安装,sublimepackage

    Mac下sublime text 的“package control”安装,sublimepackage 小伙伴们好,我根据昨晚的经历写一个小总结:关于“Mac下sublime text 的“pack ...