what:什么是代理模式
为其他对象提供一种代理以控制对这个对象的访问
why:为什么要使用代理模式
中介隔离:在某些情况下,一个客户端不想或不能直接引用一个委托对象,而代理类对象可以在客户类和委托对象之间起到中介的作用,其特征是代理类和委托类实现相同的接口
开闭原则,增加功能:此外,我们还可以通过给代理类增加额外的功能来扩展委托类的功能,这样做我们只需要修改代理类而不需要在修改委托类,符合代码的开闭原则。
日常开发中,代理类主要负责为委托类预处理消息、过滤消息、并把消息发送给委托类,以及时候对返回结果的处理等。
代理类本身并正真实现服务,而是通过调用委托类的相关方法,来提供特定的服务。真正的服务还需由委托类来实现,但可以在业务功能执行的前后加入公共的服务,例如我们可以加一些缓存、日志这些功能
代理模式主要包含三个角色,即抽象主题角色(subject),委托类角色(delegate,被代理角色)以及代理类角色(proxy)
1、代理模式实现方式?
静态代理和动态代理
静态代理是由程序员创建或工具生成代理类的源码,再编译代理类。
所谓静态也就是在程序运行前就已经存在代理类的字节码文件,代理类和委托类的关系在运行前就确定了。
1、抽象主题角色
public interface OrderService {
void order();
}
2、委托类
public class OrderServiceImpl implements OrderService {
public void order() {
System.out.println("用户下单操作..");
}
}
3、代理类
public class OrderServiceProxy implements OrderService {
/**
* 代理对象
*/
private OrderService proxiedOrderService;
public OrderServiceProxy( OrderService orderService) {
this.proxiedOrderService=orderService;
}
public void order() {
System.out.println("日志收集开始..");
proxiedOrderService.order();
System.out.println("日志收集结束..")