在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. 为BlueLake主题增加自定义icon图标

    一.前言 hexo 的 Bluelake 主题是我一直在用的,简单大方,很喜欢.但最近有了添加自定义 icon 图标的需求,比如,添加 "地址"."扫一扫".& ...

  2. mysql中更改字符集为utf8&&mysql中文输入不了问题解决

    写给TT:对不起啦!! 嗯,输入不了中文,大多数问题是mysql的字符集设置的问题,当然,别的问题也有可能, 这里我们用两种方法设置mysql的字符集,图形化工具和命令行的方式(一种操作完即可) 一, ...

  3. 《ASP.NET Core 高性能系列》关于性能的闲聊

    一.通常的性能问题类型 让我们一起看看那些公共的性能问题,看看他们是或者不是.我们将了解到为什么我们常常在开发期间会错过这些问题.我们也会看看当我们考虑性能时语言的选择.延迟.带宽.计算等因素. 二. ...

  4. 2、pycharm安装及相关配置

    PyCharm是一种Python IDE,带有一整套可以帮助用户在使用Python语言开发时提高其效率的工具,比如调试. 语法高亮.Project管理.代码跳转.智能提示.自动完成.单元测试.版本控制 ...

  5. 用tensorflow的Eager执行模式

    一.即时执行模式 import tensorflow as tfimport tensorflow.contrib.eager as tfetfe.enable_eager_execution() a ...

  6. 使用postman测试接口

    1.什么是接口测试 其实接口测试就和普通功能测试没什么区别,区别就是功能测试是在页面上点点点,在页面上输入值,提交数据看结果,而接口测试没有页面,通过接口规范文档上的调用地址.请求参数,拼接报文,然后 ...

  7. SIFT特征匹配算法介绍

    原文路径:https://www.learnopencv.com/histogram-of-oriented-gradients/ 按语:偶得SIFT特征匹配算法原理介绍,此文章确通俗易懂,分享之! ...

  8. VirtualBox 虚拟机 从入门到入坑

                                                                                                        ...

  9. 整合spring-data-redis以及redisTemplate的使用

    一.导入依赖配置 <dependency> <groupId>redis.clients</groupId> <artifactId>jedis< ...

  10. Linux vi & bash使用笔记

    f 1.vi入门级命令 打开或新建 vi filename 有三种模式,刚开始进去的是一般模式,在一般模式下按 I 之后进入编辑模式 ,按Esc进入命令模式 在命令模式下按 :wq 保存退出 多个窗口 ...