代理模式(Proxy)
代理模式是一种结构型模式,它可以通过一个类代理另一个类的功能。代理类持有被代理类的引用地址,负责将请求转发给代理类,并且可以在转发前后做一些处理
图解
角色
- 抽象主题(Subject): 定义代理对象和被代理对象的接口
- 真实主题(Real Subject):即被代理对象,实现抽象主题的接口。
- 代理(Proxy):实现抽象主题接口,持有代理对象的引用,在调用真实主题对象的方法时,可以在调用前后做一些处理
- 客户端:使用抽象主题接口来操作真实主题或代理主题,不需要知道具体是哪一个实现类
代码实现
抽象主题
public interface Pay {
public void play();
}
真实主题:
public class PayService implements Pay{
@Override
public void play() {
System.out.println("支付成功!");
}
}
代理
public class ProxyPayService implements Pay{
private Pay pay;
public ProxyPayService(Pay pay) {
this.pay = pay;
}
@Override
public void play() {
System.out.println("支付前,查询余额");
pay.play();
System.out.println("支付后,积分操作");
}
}
客户端:
public class Test {
public static void main(String[] args) {
PayService payService = new PayService();
ProxyPayService proxyPayService = new ProxyPayService(payService);
proxyPayService.play();
}
}
总结
可以发现代理类只能代理实现Pay接口的类,不够灵活。开发过程中,经常会有日志、事务等的操作是不区分业务逻辑的,可以使用动态代理。
代理模式和装饰模式非常相似,只是在语义上不一样
动态代理
java中的动态代理