代理的作用是:为其他对象提供一种代理用以控制这个对象的访问。代理可以起到一种中介的作用。
代理模式有三个角色
1 抽象角色:是真实角色和代理角色真实的接口。
2 代理角色:含有对真实角色的引用,可以操纵真实角色,在封装真实角色的同时可以附加其他操作
3 真实角色:代理角色所代表的真实对象,是最终要引用的对象。
代理模式分为静态代理模式和动态代理模式,先说静态代理模式
一、建一个抽象角色,可以用抽象类,也可以用接口
/**
* Created by charleszhu on 14-2-15.
* 抽象角色
*/
public interface Subject {
public void request();
}
二、新建真实角色,实现抽象角色
/**
* Created by charleszhu on 14-2-15.
* 真实角色
*/
public class RealSubject implements Subject {
@Override
public void request() {
System.out.println("realSubject invoked!!");
}
}
三、新建代理角色,含有对真实角色的应用,可以封装其他附加操作
/**
* Created by charleszhu on 14-2-15.
* 代理角色
*/
public class ProxySubject implements Subject {
private RealSubject realSubject;//代理角色内部持有真实角色的引用,用来操纵找真实结果
@Override
public void request() {
// 可以封装附加操作
this.before();
if(null == realSubject){
realSubject = new RealSubject();
}
realSubject.request();
// 封装附加操作
this.after();
}
// 代理角色可以增加新的功能
public void before(){
System.out.println("before request");
}
// 代理角色可以增加新的功能
public void after(){
System.out.println("after request");
}
}
四、简单测试
/**
* Created by charleszhu on 14-2-15.
*/
public class Client {
public static void main(String[] args) {
Subject ps = new ProxySubject();
ps.request();
}
}
输出结果:
before request
realSubject invoked!!
after request
然而java的静态代理在实际应用中又一些不足:
1,真实角色必须事先存在;2,一个真实角色必须又一个代理角色,大量使用会导致类的数目膨胀,3,若事先不知道真实角色,要如何代理?
这些问题可以用动态代理模式解决