在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设计模式——代理模式的更多相关文章

  1. 9. 星际争霸之php设计模式--代理模式

    题记==============================================================================本php设计模式专辑来源于博客(jymo ...

  2. C++设计模式——代理模式

    前言 青春总是那样,逝去了才开始回味:大学生活也是在不经意间就溜走了,现在上班的时候,偶尔还会怀念大学时,大家在一起玩游戏的时光.大学喜欢玩游戏,但是可悲的校园网,速度能把人逼疯了:还好,后来搞了一个 ...

  3. PHP设计模式-代理模式

    概念理解: 代理模式,是对简单处理程序(或指针)的增强,用于引用一个对象:这个指针被代理对象取代,代理对象位于客户端和真实程序之间,指针有一个可被多个目标利用的钩子. 参与者: client(参与者) ...

  4. Java设计模式-代理模式之动态代理(附源代码分析)

    Java设计模式-代理模式之动态代理(附源代码分析) 动态代理概念及类图 上一篇中介绍了静态代理,动态代理跟静态代理一个最大的差别就是:动态代理是在执行时刻动态的创建出代理类及其对象. 上篇中的静态代 ...

  5. 浅谈Python设计模式 - 代理模式

    声明:本系列文章主要参考<精通Python设计模式>一书,并且参考一些资料,结合自己的一些看法来总结而来. 一.在某些应用中,我们想要在访问某个对象之前执行一个或者多个重要的操作,例如,访 ...

  6. Java 之 设计模式——代理模式

    设计模式——代理模式 一.概述 1.代理模式 (1)真实对象:被代理的对象 (2)代理对象:代理真实对象的 (3)代理模式:代理对象代理真实对象,达到增强真实对象功能的目的 二.实现方式 1.静态代理 ...

  7. [Head First设计模式]抢票中的设计模式——代理模式

    系列文章 [Head First设计模式]山西面馆中的设计模式——装饰者模式 [Head First设计模式]山西面馆中的设计模式——观察者模式 [Head First设计模式]山西面馆中的设计模式— ...

  8. JAVA 设计模式 代理模式

    用途 代理模式 (Proxy) 为其他对象提供一种代理以控制对这个对象的访问. 代理模式是一种结构型模式. 结构

  9. Java设计模式 - 代理模式

    1.什么是代理模式: 为另一个对象提供一个替身或占位符以访问这个对象. 2.代理模式有什么好处: (1)延迟加载 当你需要从网络上面查看一张很大的图片时,你可以使用代理模式先查看它的缩略图看是否是自己 ...

  10. 深入浅出设计模式——代理模式(Proxy Pattern)

    模式动机在某些情况下,一个客户不想或者不能直接引用一个对象,此时可以通过一个称之为“代理”的第三者来实现间接引用.代理对象可以在客户端和目标对象之间起到中介的作用,并且可以通过代理对象去掉客户不能看到 ...

随机推荐

  1. (树形DP入门题)Anniversary party(没有上司的舞会) HDU - 1520

    题意: 有个公司要举行一场晚会.为了让到会的每个人不受他的直接上司约束而能玩得开心,公司领导决定:如果邀请了某个人,那么一定不会再邀请他的直接的上司,但该人的上司的上司,上司的上司的上司等都可以邀请. ...

  2. 高阶函数及 map、reduce、filter 的实现

    博客地址:https://ainyi.com/85 2020 开年国家经历了不少困难,最为凶猛的局势就是新型冠状病毒的蔓延,国务院最终决定春节假期延长至==2 月 2 号==:公司决定 3 - 7 号 ...

  3. Spring注解开发系列专栏

    这个系列主要是讲Spring注解的使用,可以为后面SpringBoot的学习带来一定的帮助.我觉得从Spring直接过度到SpringBoot还是有点快,还是得需要一个演变的过程.从Spring开发, ...

  4. 用Java实现一个简单的DBMS(总结)

    时间:2020/1/16 写这个DBMS(说DBMS夸张了,应该是一个控制台程序)的起因是数据库实践老师布置的一个大作业,先贴上GitHub地址: https://github.com/machi12 ...

  5. 图像GIST特征和LMGIST包的python实现(有github)

    1什么是Gist特征        (1) 一种宏观意义的场景特征描述        (2) 只识别"大街上有一些行人"这个场景,无需知道图像中在那些位置有多少人,或者有其他什么对 ...

  6. Vue系列教程(一)基础介绍

    什么是Vue.js Vue.js 是目前最火的一个前端框架,React是最流行的一个前端框架(React除了开发网站,还可以开发手机App,Vue语法也可以进行手机App的开发,需要借助Weex) V ...

  7. 用java编写代码实现关机

    public static void main(String[] args) { Runtime runtime = Runtime.getRuntime(); try { runtime.exec( ...

  8. Struts(四)

    1.Struts 2提供了非常强大的类型转换功能,提供了多种内置类型转换器,也支持开发自定义类型转换器2.Struts 2框架使用OGNL作为默认的表达式语言 ==================== ...

  9. AI: 字体设计中的贝塞尔曲线

    http://www.xueui.cn/tutorials/illustrator-tutorials/designers-must-know-the-secret-of-the-bezier-cur ...

  10. Dubbo(五):Dubbo中的URL统一资源模型与Dubbo协议

    一.URL简介 URL也就是Uniform Resource Locator,中文叫统一资源定位符.Dubbo中无论是服务消费方,或者服务提供方,或者注册中心.都是通过URL进行定位资源的.所以今天来 ...