Java设计模式——Proxy(代理)模式

Proxy(代理)模式为对象提供一个代理或者占位来控制对该对象的访问。

图像代理

使用Proxy模式的设计有时非常脆弱,它们依赖转发方法来调用其底层对象。转发可能会建立一个非常脆弱并且需要经常维护的设计。

load()方法以JFrame对象为参数,用于在指定图像加载完毕之后进行回调。在执行load()方法的时候,它先以LOADING引用的图像对象为参数调用setImage(),然后重新绘制图形显示窗口,最后为自己启动一个单独的线程。而run()方法是在单独的线程中执行的,该方法根据构造器中指定的图像文件名创建一个新的ImageIcon对象,然后以该图像对象为参数调用setImage()方法,最后重绘该窗口。

远程代理

在Java的远程方法调用(RMI)在,代理对象用于将调用请求转发给在另一台计算机上运行的指定对象,客户可以很容易地获得这种代理对象。

若要使用RMI,首先要创建一个远程接口,定义需要在计算机之间交换的消息,再创建一个远程对象;该远程对象可实现远程接口,并拓展UnicastRemoteObject类

public interface Rocket extends Remote
{
	void boost(double factor) throws RemoteException;
	double getApogee() throws RemoteException;
	double getPrice() throws RemoteException;
}
public class RocketImpl extends UnicastRemoteObject implements Rocket
{
	protected double price;
	protected double apogee;
	public RocketImpl(double price,double apogee) throws RemoteException{
	   this.price=price;
	   this.apogee=apogee;
	}
	public void boost(double factor){
	   apogee *= factor;
	}
	public double getApogee(){
	   return apogee;
	}
	public double getPrice(){
	   return price;
	}
}

RocketImpl对象作为服务提供者类运行在服务器上,客户端可以通过运行在本地的代理对象来访问RocketImpl对象的方法。

RocketImpl的实例运行在一台机器上,我们要让它能够被运行在其他机器上的Java程序访问,就必须在客户端为RocketImpl对象提供一个代理对象。为了实现此目的,客户端需要一个RocketImpl对象的代理。该代理类必须实现Rocket接口,并且提供用于与远程对象通信的附加特性。RMI的最大便利之一就是它能够自动创建这个代理类。为了自动生成代理类,我们必须把RocketImpl.java文件和Rocket.java接口文件存放在RMI注册程序的运行目录下。

在对象能够被远程访问之前,我们必须用运行在服务器上的RMI注册程序注册该对象。在服务器上运行了注册程序之后,我们便可以开始创建和注册RocketImpl对象。

public class RegisterRocket
{
	public static void main(String[] args){
	   try{
	     Naming.rebind("rmi://localhost:5000/Biggie",biggie);
		 System.out.println("Registered biggie");
	   }catch(Exception e){
	     e.printStackTrace();
	   }
	}
}

运行RegisterRocket应用程序便可在服务器上创建并运行一个RocketImpl对象biggie。客户端只要能够访问Rocket接口和RocketImpl_stub类,便可以访问远程运行的biggie对象。如果只有一台机器,我们仍然可以测试这个RMI应用程序,不过要在localhost而不是另外一台主机上运行服务器端代码。

public class ShowRocketClient
{
	public static void main(String[] args){
	   try{
	      Object obj=Naming.lookup("rmi://localhost:5000/Biggie");
		  Rocket biggie = (Rocket) obj;
		  System.out.println("Apogee is " + biggie.getApogee());
	   }catch(Exception e){
	      System.out.println("Exception while looking up a rocket:");
		  e.printStackTrace();
	   }
	}
}

RMI的优点在于它使得客户端程序只需与本地代理对象进行交互便可达到与远程对象通信的目的。RMI用户定义了客户端和

服务器端共享对象的接口。RMI为客户端和服务器端分别提供一个Rocket接口的实现类;这两个实现类相互协作,从而可

完成进程间的无缝通信。服务器端和客户端则不必关心这些细节。

动态代理

Java可支持动态代理的特性。借助于动态代理,可以使用代理对象来包装其他对象,使用代理对象截获对被包装对象的调

用请求,然后代理继续把这些请求转发给被包装对象。在执行被截获的调用之前或之后,我们可以编写相关的加强代码。

对动态代理加以限制可以防止包装其他随意的对象。在正常条件下,动态代理使你能够完全控制被包装对象的操作。

动态代理需要使用对象的类所实现的接口。代理对象可以截获的调用就是这些接口定义的调用。如果某个类可以实现要截

获的接口,就可以使用动态代理来包装那个类的实例。

public class ShowDynamicProxy
{
	public static void main(String[] args){
	   Set s = new HashSet();
	   s = ImpatientProxy.newInstance(s);
	   s.add(new BadApple("Lemon"));
	   ...
	   System.out.println("The set contains " + s.size() + " things.");
	}
}

待续

时间: 2024-12-30 03:44:03

Java设计模式——Proxy(代理)模式的相关文章

JAVA设计模式(3)----代理模式

1.  什么是代理模式?Proxy Pattern 代理模式定义:为其他对象提供一种代理以控制对这个对象的访问.在某些情况下,一个对象不适合或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用. 通俗的讲,代理模式就是我很忙没空理你,你要想找我可以先找我的代理人,代理人和被代理人继承同一个接口.代理人虽然不能干活,但是被代理的人可以干活. 这个例子中有水浒传中的这么几个人:名垂青史的潘金莲,王婆,西门大官人.西门庆想要找潘金莲,需要找王婆做代理.首先定义一个接口:Kin

java设计模式6——代理模式

java设计模式6--代理模式 1.代理模式介绍: 1.1.为什么要学习代理模式?因为这就是Spring Aop的底层!(SpringAop 和 SpringMvc) 1.2.代理模式的分类: 静态代理 动态代理 1.3.代理模式关系图(以租房子为例) 2.静态代理 2.1.角色分析: 抽象角色:一般会使用接口或者抽象类来解决 真实角色:被代理的角色 代理客户:代理真实角色.代理真实角色后,我们一般会做一些附属的操作 客户:访问代理对象的人 2.2.例1(租房子演示) 2.2.1.抽象角色实现(

JAVA设计模式之代理模式

学编程吧JAVA设计模式之代理模式发布了,欢迎通过xuebiancheng8.com来访问 一.概述 给某一个对象提供一个代理,并由代理对象来完成对原对象的访问.代理模式是一种对象结构型模式. 二.适用场景 当无法直接访问某个对象或访问某个对象存在困难时可以通过一个代理对象来间接访问,为了保证客户端使用的透明性,委托对象与代理对象需要实现相同的接口. 三.UML类图 四.参与者 1.接口类:Subject 它声明了真实访问者和代理访问者的共同接口,客户端通常需要针对接口角色进行编程. 2.代理类

java设计模式之八代理模式(Proxy)

其实每个模式名称就表明了该模式的作用,代理模式就是多一个代理类出来,替原对象进行一些操作,比如我们在租房子的时候回去找中介,为什么呢?因为你对该地区房屋的信息掌握的不够全面,希望找一个更熟悉的人去帮你做,此处的代理就是这个意思.再如我们有的时候打官司,我们需要请律师,因为律师在法律方面有专长,可以替我们进行操作,表达我们的想法.先来看看关系图: 根据上文的阐述,代理模式就比较容易的理解了,我们看下代码: [java] view plaincopy public interface Sourcea

java设计模式学习 ----- 代理模式(Proxy)

代理模式(Proxy) 其实每个模式名称就表明了该模式的作用,代理模式就是多一个代理类出来,替原对象进行一些操作,比如我们在租房子的时候回去找中介,为什么呢?因为你对该地区房屋的信息掌握的不够全面,希望找一个更熟悉的人去帮你做,此处的代理就是这个意思.再如我们有的时候打官司,我们需要请律师,因为律师在法律方面有专长,可以替我们进行操作,表达我们的想法.先来看看关系图: 根据上文的阐述,代理模式就比较容易的理解了,我们看下代码: public interface Sourceable { publ

Java设计模式之-------->"代理模式"

01.什么是代理模式? 解析:代理(Proxy):代理模式的主要作用是为其他对象提供一种代理以控制对这个对象的访问.在某些情况下,一个对象不想或者不能直接引用另一个对象, 而代理对象可以在客户端和目标对象之间起到中介的作用.代理模式的思想是为了提供额外的处理或者不同的操作而在实际对象与调用者之间插入一个代理对象. 这些额外的操作通常需要与实际对象进行通信. 02.代理的组成都有什么? 解析:由三部分组成,分别是:抽象对象(Subject 接口),真实对象(RealSubject 实现了Subje

Java设计模式之代理模式(Proxy)

前言: 最近在研究Retrofit开源框架的时候,其主要核心代码是通过注解标示参数,动态代理模式实现具体接口,反射机制进行参数解析,最终实现发送请求.其实之前在学习Xutils源码的时候,Xutils 的task也是通过代理模式来访问的.为何要采用代理模式呢?有什么好处呢?抱着这些疑问!今天来学习总结一下. 什么是代理模式? 代理模式的定义:代理模式给某一个对象提供一个代理对象,并由代理对象控制对原对象的引用.举例说明,就是一个人或者一个机构代表另一个人或者另一个机构采取行动.在一些情况下,一个

JAVA设计模式之 代理模式【Proxy Pattern】

一.概述 给某一个对象提供一个代理,并由代理对象来完成对原对象的访问.代理模式是一种对象结构型模式. 二.适用场景 当无法直接访问某个对象或访问某个对象存在困难时可以通过一个代理对象来间接访问,为了保证客户端使用的透明性,委托对象与代理对象需要实现相同的接口. 三.UML类图 四.参与者 1.接口类:Subject 它声明了真实访问者和代理访问者的共同接口,客户端通常需要针对接口角色进行编程. 2.代理类:ProxySubject 包含了对真实(委托)对象(RealSubject)的引用,在实现

Java 设计模式_代理模式(2016-08-19)

概念: 代理模式是对象的结构模式.代理模式给某一个对象提供一个代理对象,并由代理对象控制对原对象的引用. 就是一个人或者机构代表另一个人或者机构采取行动.在一些情况下,一个客户不想或者不能够直接引用一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用. 类图: 在代理模式中的角色: ● 抽象对象角色:声明了目标对象和代理对象的共同接口,这样一来在任何可以使用目标对象的地方都可以使用代理对象. ● 目标对象角色:定义了代理对象所代表的目标对象. ● 代理对象角色:代理对象内部含有目标对象的