在代理模式中,主要有两类角色,一是被代理类(RealSubject),二是代理类(Proxy),他们都为同一个抽象主题接口(ISubject)的导出类。从功能上来说,被代理类在设计时,关注该类的核心功能,而代理类则主要关注处理不同代理者之间不同功能的差异或是一些准备工作。打个比方说,客户(被代理类)只需要阐明自己的官司起因原由以及个人诉求,而交由律师(代理类)处理文件呈交等一系列法律程序问题。一个法庭(应用环境)可能是同一个律师来打官司,但由于这个律师代理的客户不同,就是不同的案件。
放一张类图:
那么唯一的问题就是:如何建立起代理类与被代理类之间的关系。
一般的方案是,如类图中所示,在代理类Proxy中包含一个Subject类型的私有成员变量,在其构造器中传入一个Subject类型的被代理者对象,从而完成代理类与被代理类的关联关系。
而service()是被代理类的核心功能方法,before()和after()用于模拟代理类做的其他工作。
源代码如下:
Subject.java
/**
* Created by Song on 2016/10/9.
* 抽象主题类
*/
public interface Subject {
void service();
}
RealSubject.java
/**
* Created by Song on 2016/10/9.
* 被代理类的一个实例
*/
public class RealSubject implements Subject {
private String name; //名称
public RealSubject(String name){
this.name = name;
}
public void service() {
System.out.println("我是"+this.name+",我要打民事纠纷官司");
}
}
Proxy.java
/**
* Created by Song on 2016/10/9.
* 代理类
*/
public class Proxy implements Subject {
private Subject subject; //被代理类实例
public Proxy(Subject subject){
this.subject = subject;
}
public void before(){
System.out.println("代理律师向法庭呈交诉讼书等");
}
public void after(){
System.out.println("代理律师跟相关部分结案");
}
public void service() {
this.before();
this.subject.service();
this.after();
}
}
测试:
/**
* Created by Song on 2016/10/9.
*/
public class Client {
public static void main(String [] args){
Proxy lawyer = new Proxy(new RealSubject("路人甲"));
lawyer.service();
}
}
结果:
从代码结构上来说,代理模式,好比是将一系列事件进行逻辑抽象后,将共同的逻辑功能剥离出来,作为代理类的成员方法,而将不同的逻辑部分作为被代理类的核心功能。从而优化系统架构。使得系统更加易于扩展。
最后附上代理模式(也叫委托模式)的定义:Provide a surrogate or placeholder for another object to control access to it.即为其他对象提供一种代理以控制对这个对象的访问。