Head First设计模式——代理模式
在HeadFirst设计模式中代理模式用了比较多的篇幅来讲解,其中的例子我感觉有些繁琐,所以我们这篇就不按照惯例用例子来阐述代理模式了。我们直接进入正题,分析模式本身的设计和解决的问题。
远程代理模式
假如我们有一个系统,能够调用本地对象,然后将每个请求转发到远程对象上进行调用应该如何设计。

在客户端我们使用客户辅助对象进行调用,客户辅助对象进行远端调用,对于客户对象来说就像是在调用本地的方法一样。
在服务端,服务辅助对象从客户辅助对象中接受请求(socket连接),将调用的信息解包,然后调用真正服务对象上的方法。
我们利用代码更清楚的看到实现过程和方式,书中利用java的RIM来进行远程方法调用,我们不必纠结RIM,只要知道RIM是帮我们实现演出调用处理网络和I/O代码。
1、远端接口
首先我们需要一个接口用于客户辅助对象和服务辅助对象的统一接口。
public interface MyRemote extends Remote{
public String SayHello() throws RemoteException;
}
Remote 是RIM包中的接口,使用RIM需要实现Remote接口。
2、远端实现
服务实现远端接口,也就是客户端要调用的方法的接口。
public class MyRemoteImpl implements MyRemote{
public String SayHello(){
return "server say hello";
}
}
3、注册服务
现在我们已经实现了一个远程服务了,要他能被客户端远程调用。就需要将服务实例化并注册到RIM registry中,注册使用了rmi 中的Naming类的静态方法rebind()
我们可以直接在远程服务的main() 方法中注册就行了。
public static void main(String args[]){
try{
MyRemote service=new MyRemoteImpl();
Naming.rebind("RemoteHello",service);
}catch(Exception ex){
ex.printStackTrace();
}
}
4、客户端实现
由于第三步我们已有了注册服务的实现,客户端要想调用远端服务就需要通过网络发现服务并调用。利用Naming.lookup()方法返回值并将他转成远端接口进行调用。
public class MyRemoteClient(){
public static void main(String[] args){
new MyRemoteClient().go();
}
public void go(){
try{
MyRemote service=(MyRemote) Naming.lookup(rmi://127.0.0.1/RemoteHello);
String result=service.SayHello();
System.out.println(result);
}catch(Exception ex){
ex.printStackTrace();
}
}
}
整个执行过程:RIM启动rmiregistry终端,启动远端服务运行到main()方法进行服务注册。客户端运行main()方法查找服务返回Object进行转换到远端接口对象,调用接口对象的方法进行代理访问远端服务。
在上面的代码中部分代码不完善只是讲解远程带来和过程,同样的.Net 实现远程代理的一个经典用例就是WCF,看看WCF的模式是不是完美契合远程代理模式。
代理模式
通过远程代理模式我们已经知道代理模式的概念和一种实现了,远程代理是一般代理模式的一种实现。因为代理模式包含许多变体,包括一般代理模式、虚拟代理模式、动态代理、缓存代理、同步代理等等。

这个类图是一般代理模式的类图。
首先Subject,它为RealSubject和Proxy提供了接口。通过实现同一接口,Proxy在RealSubject出现的地方取代它。
RealSubject是真正做事情的对象,它是被Proxy代理和控制访问的对象。
Proxy持有RealSubject的引用。在某些时候,Proxy还会负责RealSubjext对象的创建与销毁。
代理模式:为另一个对象提供一个替身或占位符以控制对这个对象的访问。
使用代理模式创建代表对象,让代表对象控制某对象的访问,被代理的对象可以是远程对象、创建开销大的对象或者需要安全控制的对象。
Head First设计模式——代理模式的更多相关文章
- 9. 星际争霸之php设计模式--代理模式
题记==============================================================================本php设计模式专辑来源于博客(jymo ...
- C++设计模式——代理模式
前言 青春总是那样,逝去了才开始回味:大学生活也是在不经意间就溜走了,现在上班的时候,偶尔还会怀念大学时,大家在一起玩游戏的时光.大学喜欢玩游戏,但是可悲的校园网,速度能把人逼疯了:还好,后来搞了一个 ...
- PHP设计模式-代理模式
概念理解: 代理模式,是对简单处理程序(或指针)的增强,用于引用一个对象:这个指针被代理对象取代,代理对象位于客户端和真实程序之间,指针有一个可被多个目标利用的钩子. 参与者: client(参与者) ...
- Java设计模式-代理模式之动态代理(附源代码分析)
Java设计模式-代理模式之动态代理(附源代码分析) 动态代理概念及类图 上一篇中介绍了静态代理,动态代理跟静态代理一个最大的差别就是:动态代理是在执行时刻动态的创建出代理类及其对象. 上篇中的静态代 ...
- 浅谈Python设计模式 - 代理模式
声明:本系列文章主要参考<精通Python设计模式>一书,并且参考一些资料,结合自己的一些看法来总结而来. 一.在某些应用中,我们想要在访问某个对象之前执行一个或者多个重要的操作,例如,访 ...
- Java 之 设计模式——代理模式
设计模式——代理模式 一.概述 1.代理模式 (1)真实对象:被代理的对象 (2)代理对象:代理真实对象的 (3)代理模式:代理对象代理真实对象,达到增强真实对象功能的目的 二.实现方式 1.静态代理 ...
- [Head First设计模式]抢票中的设计模式——代理模式
系列文章 [Head First设计模式]山西面馆中的设计模式——装饰者模式 [Head First设计模式]山西面馆中的设计模式——观察者模式 [Head First设计模式]山西面馆中的设计模式— ...
- JAVA 设计模式 代理模式
用途 代理模式 (Proxy) 为其他对象提供一种代理以控制对这个对象的访问. 代理模式是一种结构型模式. 结构
- Java设计模式 - 代理模式
1.什么是代理模式: 为另一个对象提供一个替身或占位符以访问这个对象. 2.代理模式有什么好处: (1)延迟加载 当你需要从网络上面查看一张很大的图片时,你可以使用代理模式先查看它的缩略图看是否是自己 ...
- 深入浅出设计模式——代理模式(Proxy Pattern)
模式动机在某些情况下,一个客户不想或者不能直接引用一个对象,此时可以通过一个称之为“代理”的第三者来实现间接引用.代理对象可以在客户端和目标对象之间起到中介的作用,并且可以通过代理对象去掉客户不能看到 ...
随机推荐
- python 进程事件
1.作用 通过信号量,控制全部进程进入阻塞状态,也可以通过控制信号量,解除全部进程的阻塞 注意:定义的事件对象,默认状态是阻塞 2.常用方法 """ 对象.set() 作 ...
- mongo 查询 距离 某个点 多少 米距离 感谢 提供的数据。 感谢 mvc的 demo 。反正 就是各种感谢 文档之类的。
昨天 去面试来着, 问了一下mong . 我记得mong支持 地理位置索引的,说了一下. 然后 面试官说 查询某个点 的 多少米范围, 这个该怎么实现? 我懵逼了.... 回去 查询了一下. 发现有 ...
- OpenCV各种绘制调用:线,矩形,圆,椭圆,文字
OpenCV提供了各种绘制接口,可以往图片里画各种东西,这种功能可以为以后在图像上标记一些信息方便调试 // drawcall.cpp: 定义控制台应用程序的入口点. // #include &quo ...
- CSS-02-css的三种基础选择器
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
- a标签跳转小程序
随着小程序应用的逐步广泛,与公众号之前的协同运营越来越重要,通过公众号的各个入口为小程序导流.最近在运营中发现,大家对公众号关注后回复.关键词回复,超链接小程序的需求. 首先把小程序绑定 ...
- Linux下的openssh详解
前言 SSH(Secure Shell)是一个提供数据通信安全.远程登录.远程指令执行等功能的安全网络协议,由芬兰赫尔辛基大学研究员Tatu Ylönen,于1995年提出,其目的是用于替代非安全的T ...
- python中更人性化的一个单元测试框架:nose2
如果你学过 python 进行自动化测试,你一定使用过 unittest.今天我们要讲的 nose2 是一个高级版本的 unittest.他比 unittest 更容易理解,用起来也更加方便一些. 快 ...
- NLP(二十)利用BERT实现文本二分类
在我们进行事件抽取的时候,我们需要触发词来确定是否属于某个特定的事件类型,比如我们以政治上的出访类事件为例,这类事件往往会出现"访问"这个词语,但是仅仅通过"访问&q ...
- linux笔记之解压
从1.15版本开始tar就可以自动识别压缩的格式,故不需人为区分压缩格式就能正确解压: Linux下常见的压缩包格式有5种:zip tar.gz tar.bz2 tar.xz tar.Z 其中tar是 ...
- objectarx 统计面积
除了最后一个输出面积到excel没做,其他都是做了的.只支持AcDbPolyline和AcDbCircle.这是我模仿网上的动态图做的,主要是为了练习.下面我把自己的一些心得分享出来.使用到的一些帮助 ...