代理模式(design pattern : proxy)
代理模式属于结构模式,其目的是为其对象提供一种代理,以控制对这个对象的访问。代理模式的用途非常广泛,如下一些场景
- 在网络环境下,使用远程代理(romote proxy)对客户隐藏网络通信细节,使得客户可以透明的进行网络操作,就如同本地操作一样.
- 一个可在文档中嵌入图形对象的文本编辑器(如word),有些图形对象的创建开销很大,但是打开文档必须很快速,因此在打开文档时要避免一次性创建所有开销大的对象。以为所有这些对象并不是同时可见的,所以也没有必要同时创建这些对象,这时候可以引入虚拟代理(virtual proxy)来代替那个真正的图形,只有文档编辑器激活图形代理的draw操作时,图形代理才真正的创建这个图形。
- 通过代理,拦截对真是对象的访问,以实现一些附加的处理,如前处理和后处理等,这也是一种经典aop代理的实现手法。
- 代理模式也是隔离一些和业务无关的数据库具体操作的好方法。
代理模式参与者:
- 代理(proxy):持有一个实体的引用,使得代理可以访问实体;提供一个与目标(subject)的接口相同的接口,使代理可以替代实体;控制对实体的存取,负责创建和删除它,其他功能依赖与上述提到的代理的类型。
- 目标(subject):定义真实目标(realsubject)和代理(proxy)的公共接口,在任何使用realsubject的地方都可以使用proxy。
- realsubject:定义代理(proxy)所代表的实体。
普通代理、code
-------目标类-------
public abstract class Subject {
abstract public void operation();
}
-------目标实现类------
public class RealSubject extends Subject {
public void operation() {
System.out.println("this is operation");
}
}
-------代理类-------
public class Proxy extends Subject {
/**
* 持有一个实体引用使得代理可以访问实体
*/
private Subject subject;
/* (non-Javadoc)
* @see Subject#operation()
* 实现父类的抽象方法,控制对实体的存取,负责创建和删除
*/
public void operation() {
this.beforeOperation();
if(subject==null){
subject= new RealSubject();
}
subject.operation();
this.afterOperation();
}
/**
* 在operation之前执行。前操作
*/
public void beforeOperation() {
System.out.println("before do something");
}
/**
* 在operation之后执行。后操作
*/
public void afterOperation() {
System.out.println("after do something");
}
/**使用抽象实体来初始化代理对象
* @param subject
*/
public Proxy(Subject subject) {
this.subject=subject;
}
/**测试方法
* @param args
*/
public static void main(String[] args){
Subject subject = new Proxy(new RealSubject());
subject.operation();
}
}
-----------------测试结果----------------
before do something
this is operation
after do something
动态代理、
虚拟代理