Object-c和Java中的代理
代理模式的核心思想就是一个类想做一件事情(函数),但它不去亲自做(实现),而是通过委托别的类(代理类)来完成。
代理模式的优点:
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中的代理的更多相关文章
- java中Proxy(代理与动态代理)
转自: https://blog.csdn.net/pangqiandou/article/details/52964066 一.代理的概念 动态代理技术是整个java技术中最重要的一个技术,它是学习 ...
- (转)轻松学,Java 中的代理模式及动态代理
背景:讲到反射机制,肯定会想到动态代理. 轻松学,Java 中的代理模式及动态代理 代理模式可以在不修改被代理对象的基础上,通过扩展代理类,进行一些功能的附加与增强.值得注意的是,代理类和被代理类应该 ...
- java中动态代理的实现
动态代理的实现 使用的模式:代理模式. 代理模式的作用是:为其他对象提供一种代理以控制对这个对象的访问.类似租房的中介. 两种动态代理: (1)jdk动态代理,jdk动态代理是由Java内部的反射机制 ...
- java中动态代理实现机制
前言: 代理模式是常用的java设计模式,它的特征是代理类与委托类有同样的接口,代理类主要负责为委托类预处理消息.过滤消息.把消息转发给委托类,以及事后处理消息等.代理类与委托类之间通常会存在关联关系 ...
- Java中的代理模式
代理模式在Java Web的框架中经常使用到.比如说在对数据库的访问中,核心功能是对数据库的增删改查,而连接数据库.处理事务等功能我们在开发中也要考虑到.所以我们将数据库的CRUD抽象到接口中,然后实 ...
- java中静态代理,动态代理知识的补充
文章转载自:http://blog.csdn.net/jialinqiang/article/details/8950989 一.Java动态代理 相对于静态代理的代理类在编译时生成(.class文件 ...
- java中静态代理跟动态代理之间的区别
文章转载于:http://www.cnblogs.com/xiaoluo501395377/p/3383130.html 在学习Spring的时候,我们知道Spring主要有两大思想,一个是IoC,另 ...
- java中动态代理
一.在java中怎样实现动态代理 1.我们要有一个接口,还要有一个接口的实现类,而这个实现类呢就是我们要代理的对象 接口: package org.dynamicproxy.test; public ...
- JAVA中的代理技术(静态代理和动态代理)
最近看书,有两个地方提到了动态代理,一是在Head First中的代理模式,二是Spring AOP中的AOP.所以有必要补充一下动态代理的相关知识. Spring采用JDK动态代理和CGLib动态代 ...
- 深入理解JAVA中的代理模式
前言 代理是什么 事故现场:我家的宠物今天生病了,而我又没有相关的医学知识,所以我只让我的宠物多喝热水吗? 结果显然是不行的,所以我需要去找宠物医生这些更专业的人来帮我的宠物治病. 这个时候,代理就出 ...
随机推荐
- html_entity_decode() 将 HTML 实体转成字符原型
PHP html_entity_decode() 适用于PHP 4.3.0+,将HTML 实体转成字符. html_entity_decode(包含HTML 实体的字符串, 可选如何解码引号, 可选字 ...
- 差分约束系统 + spfa(A - Layout POJ - 3169)
题目链接:https://cn.vjudge.net/contest/276233#problem/A 差分约束系统,假设当前有三个不等式 x- y <=t1 y-z<=t2 x-z< ...
- linux 配置免密码登陆
在使用scp命令传输的时候需要密码 配置免密码登陆 ssh-keygen -t rsa (四个回车) 执行命令完成后,会生成两个文件id_rsa(私钥).id-rsa.pub(公钥) 将公钥拷贝到要免 ...
- CertUtil.exe被利用来下载恶意软件
1.前言 经过国外文章信息,CertUtil.exe下载恶意软件的样本. 2.实现原理 Windows有一个名为CertUtil的内置程序,可用于在Windows中管理证书.使用此程序可以在Windo ...
- Linux嵌入式交叉编译环境 的搭建【转】
转自:http://blog.csdn.net/woaixiaozhe/article/details/7395435 1. 安装标准的C开发环境,由于Linux安装默认是不安装的,所以需要先安装一下 ...
- socket相关系统调用的调用流程
最近一直在读内核网络协议栈源码,这里以ipv4/tcp为例对socket相关系统调用的流程做一个简要整理,这些相关系统调用的内部细节虽然各有不同,但其调用流程则基本一致: 调用流程: (1)系统调用 ...
- sleep允许休眠, delay不允许
在Linux Driver开发中,经常要用到延迟函数:msleep,mdelay/udelay. 虽然msleep和mdelay都有延迟的作用,但他们是有区别的. 1.)对于模块本身 mdelay是忙 ...
- 八、springboot整合redis
整合Redis 一. 注解方式实现添加缓存 1.在pom.xml加入依赖 <!-- 配置使用redis启动器 --> <dependency> <groupId>o ...
- .Net程序集强签名详解
强签名: 1. 可以将强签名的dll注册到GAC,不同的应用程序可以共享同一dll. 2. 强签名的库,或者应用程序只能引用强签名的dll,不能引用未强签名的dll,但是未强签名的dll可以引用强签名 ...
- 夜神模拟器调试android studio项目
这几天为了android studio也是醉了,先是R文件丢失忙活一下午,各种百度谷歌,最后终于解决这个小问题,没想到在启动avd这个问题上更是棘手,网上的方法试了,主要有三种,上篇博文http:// ...