在访问一个对象时进行控制
A通过代理类去访问B,而不是A直接访问B
代理类则是A访问B的中间层(访问层)
事例
需求:水果订单有本地仓库订单和第三方仓库订单两种,且第三方订单需要作访问控制
数据结构如图
接口及其实现类:
public interface OrderService {
void order();
}
// 本地仓库订单
public class OrderServiceImpl implements OrderService {
@Override
public void order() {
System.out.println("OrderServiceImpl order");
}
}
// 第三方仓库订单
public class OutOrderServiceImpl implements OrderService {
@Override
public void order() {
System.out.println("OutOrderServiceImpl order");
}
}
代理类要持有被代理类的对象,这样最终才能访问到被代理类
代理类要继承被代理类的抽象OrderService,这样才能代替被代理类
代理类:
public class ProxyOrder implements OrderService {
private OrderService mService;
public ProxyOrder() {
mService = new OutOrderServiceImpl();
}
@Override
public void order() {
System.out.println("ProxyOrder order");
// 可以添加访问控制的代码
mService.order();
// 可以添加访问控制的代码
}
}
测试:
public void proxy() {
// 通过代理类增加了访问控制,最终再调到第三方仓库的订单
OrderService service = new ProxyOrder();
service.order();
}
总结
适用场景
当要对一个类的访问加以控制时。如调用某个方法时要加上准备工作和收尾工作等
优点
- 扩展性强
- 低耦合。访问控制不需要加在客户端或服务端
缺点
- 可能会导致请求的处理变慢
- 代理类过多会增加系统复杂度,很多代理类可能业务相同(如打印时间日志)