设计模式之九:代理模式

在访问一个对象时进行控制

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();
    }

总结

适用场景

当要对一个类的访问加以控制时。如调用某个方法时要加上准备工作和收尾工作等

优点

  • 扩展性强
  • 低耦合。访问控制不需要加在客户端或服务端

缺点

  • 可能会导致请求的处理变慢
  • 代理类过多会增加系统复杂度,很多代理类可能业务相同(如打印时间日志)
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

哈哈哈利波特

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值