一、静态代理的概念
代理是指为某个对象提供一个代理,以控制对这个对象的访问,例如房东想把房子租出去,但是自己不想去做其他的麻烦事,就会交给中介公司去做,中介公司则会在帮房东租房的基础上做其他事情,例如待人看房和收中介费等等。所谓静态代理就是指由程序员创建或工具生成代理类的源码,再编译代理类。
二、静态代理模式的要求与示例
- 真实对象和代理对象要实现同一个接口
- 代理对象要代理真实对象
例如一个租房的接口
public interface Rent {
void rent();
}
房东类实现租房接口,表示房东想要租房
public class Lord implements Rent {
@Override
public void rent() {
System.out.println("房东要租房子");
}
}
对于中介来说,除了出租房子,还要做额外工作
public class proxy implements Rent{
//中介会有其想要代理的房东
private Lord lord;
//中介代理需要出租房子的房东
public proxy(Lord lord) {
this.lord = lord;
}
//中介有自己要额外做的工作
public void seeHouse(){
System.out.println("中介带人看房");
}
public void fee(){
System.out.println("收取中介费");
}
//中介实现租房动作
@Override
public void rent() {
lord.rent();//中介要帮房东来收取房租
seeHouse();//中介带人看房
fee();//收取中介费
}
}
对于顾客来说,找的是中介
public class Tenant {
public static void main(String[] args) {
//中介代理房东来租房
proxy proxy = new proxy(new Lord());
//顾客找的是中介, 所以用中介的租房动作
proxy.rent();
}
}
输出结果
房东要租房子
中介带人看房
收取中介费
不难发现,租房子的人是房东,中介帮忙做了其他事情
三、静态代理优缺点
优点:
- 真实对象可以专注于自己的工作
- 代理对象可以在真实对象基础上扩展其他工作,有解耦合的作用
缺点:
- 代理类和委托类实现了相同的接口,代理类通过委托类实现了相同的方法。这样就出现了大量的代码重复。如果接口增加一个方法,除了所有实现类需要实现这个方法外,所有代理类也需要实现此方法。增加了代码维护的复杂度
- 代理对象只服务于一种类型的对象,如果要服务多类型的对象。势必要为每一种对象都进行代理,静态代理在程序规模稍大时就无法胜任了