前言
以图文进行带入,已代码示例进行演示,浅显易懂
一、初识代理
房东想出租房子,委托给中介来出租,中介就是代理
二、介绍代理模式
从上面的UML图看到,一共有四个角色:
- Client:相当于用户类,调用代理出租
- RealSubject:房东,真正出租房子的人
- Proxy:中介,表面上出租房子的人
- Subject:抽象对象接口,这里定义了房东委托中介做的事,即出租房子
三、静态代理使用
静态代理:所谓静态代理就是在程序运行前就已经存在代理类的字节码文件,代理类和被代理类的关系在运行前就确定了
以下是代码示例
- 定义抽象接口
/**
* 定义房子抽象接口,房东让中介做的事:出租房子
*/
public interface HouseSubject {
/**
* 出租房子
*/
void rent();
}
- 定义具体的实现对象:房东出租房子
/**
* 定义具体实现对象:房东出租房子
*/
public class RealHouseSubject implements HouseSubject {
@Override
public void rent() {
System.out.println("我是房东,我要出租三室两厅的房子");
}
}
- 代理类:中介
/**
* 代理类:中介
*/
public class HouseProxy implements HouseSubject {
@Override
public void rent() {
// 中介给房子打广告
this.addAd();
HouseSubject subject = new RealHouseSubject();
subject.rent();
// 房子出租出去,撤销广告
this.removeAd();
}
private void addAd() {
System.out.println("广告:宝安西乡街道出租房子");
}
private void removeAd() {
System.out.println("房子已经出租出去了,把广告撤销");
}
}
- 租客来租房子
public class Client {
public static void main(String[] args) {
HouseSubject proxy = new HouseProxy();
proxy.rent();
}
}
- 打印运行结果
广告:宝安西乡街道出租房子
我是房东,我要出租三室两厅的房子
房子已经出租出去了,把广告撤销
现在可以看出,代理模式可以在不修改被代理对象的基础上,通过扩展类,进行一些功能的增强,代理类和被代理类是实现了同一个接口,或者是继承同一个类
四、思考
如果不同的房东对房子的要求不一样,比如房东A需要出租和打扫,房东B需要出租和装空调,房东C需要出租和砌墙,房东D等待,如果使用静态代理会有什么问题吗?
下一篇 《JDK动态代理模式一》 可以找到思考题的答案