> 文章列表 > Java设计模式(十八)—— 代理模式

Java设计模式(十八)—— 代理模式

Java设计模式(十八)—— 代理模式

一、模式简介        

代理模式定义如下:为其他对象提供一组代理以控制这对这个对象的访问。

适合代理模式的情景如下:

  • 不希望用户直接访问该对象,而是提供一个特殊的对象以控制对当前对象的访问
  • 如果一个对象需要很长时间才能加载完成
  • 如果对象位于远程主机上,需要为用户提供远程访问能力

代理模式包含如下角色:

  • ISubject:抽象主题角色,是一个接口,该接口是对象和它的代理所共用的接口
  • RealSubject:真实主题角色,是实现抽象主题接口的类
  • Proxy:代理角色,内部含有对真实对象RealSubject的引用,从而可以操作真实对象。代理对象提供与真实对象相同的接口,以便在任何时刻都能代替真实对象,同时,代理对象可以在执行真实对象操作时,附加其他的操作,相当于对真实对象进行封装。 

(1)定义抽象主题——买电视

public interface ITV {public void buyTV();
}

 (2)定义实际主题——买电视过程

public class Buyer implements ITV{@Overridepublic void buyTV() {System.out.println("我要通过代理来买电视");}
}

(3)定义代理

电视代理商和购买者都实现了接口ITV,是对Buyer对象的进一步封装。

public class BuyerProxy implements ITV{private Buyer buyer;public BuyerProxy(Buyer buyer) {this.buyer = buyer;}@Overridepublic void buyTV() {preProcess();buyer.buyTV();postProcess();}public void preProcess() {System.out.println("询问客户需要的电视类型,价位等信息");}public void postProcess() {System.out.println("负责把电视送到客户家");}
}

(4)测试类

public class Test {public static void main(String[] args) {Buyer zy = new Buyer();BuyerProxy proxy = new BuyerProxy(zy);proxy.buyTV();}
}

输出:

询问客户需要的电视类型,价位等信息
我要通过代理来买电视
负责把电视送到客户家

二、虚拟代理

        虚拟代理的关键思想是:如果需要创建一个资源消耗较大的对象,就先创建一个消耗相对较小的对象来表示,真实对象只要在需要时才会被真正创建。当用户请求一个“大”对象时,虚拟代理在该对象真正被创建出来之前扮演着替身的角色;当该对象被创建出来之后,虚拟代理就将用户的请求直接委托给该对象。

三、远程代理

        远程代理的含义是:为一个位于不同地址空间的对象提供一个本地的代理对象,这个不同的地址空间可以是在同一台主机中,也可以是另一台主机中,即远程对象驻留于服务器上,当客户机请求调用远程对象时调用相应方法,执行完毕后,结果由服务器返回给客户端。

        远程代理有两个代理,客户端通信代理和服务端通信代理。