java-设计模式-代理模式

设计模式-代理模式
    为其它对象提供一种代理已控制对这个对象的访问
    虚代理:根据需要来创建开销很大的对象 (懒加载)
    远程代理:用不同地址空间上代表同意对象
    保护代理:控制对原始对象的访问
        例如订单创建之后,只有创建者可以对订单进行修改。
    代理 在调用真实的对象前后可做权限校验等等。
    代理模式的本质:控制对象访问
    代理模式和适配器模式 都是为另一个对象提供间接性访问的,适配器主要解决接口之间不匹配的问题,代理模式则是实现和目标对象相同的接口。

来个UML图:

以下是一个屏蔽要访问对象的代理例子,例子很简单,主要是它的思路。

订单类接口:


/**
 * 订单类
 */
public interface IOrder {
    /**
     * 获取订单的信息
     */
     void getOrderMsg();

    /**
     * 编辑订单
     */
    void editOrderMsg();
}

订单实现类:


public class OrderImpl implements IOrder {
    @Override
    public void getOrderMsg() {
        System.out.println("获取订单成功");
    }

    @Override
    public void editOrderMsg() {
        System.out.println("编辑订单成功");
    }
}

代理类:


/**
 * 保护代理
 */
public class OrderProxy implements IOrder {
    OrderImpl order;
    public OrderProxy(OrderImpl iOrder){
        this.order = iOrder;
    }
    @Override
    public void getOrderMsg() {
        System.out.println("可以有权限访问");
        order.getOrderMsg();
        System.out.println("XXX 在 xxx 时候 对订单进行了访问");
    }

    @Override
    public void editOrderMsg() {
        int v = new Random().nextInt(10);
        if(v%2==0){
            System.out.println("你没有权限,不能进行编辑");
            return;
        }
        System.out.println("你有权限进行编辑");
        order.editOrderMsg();
        System.out.println("XXX 在 xxx 时候 对订单进行了编辑");
    }
}

来个测试:

    public static void main(String[] args) {
        IOrder order = new OrderProxy(new OrderImpl());
        order.getOrderMsg();
        System.out.println();
        order.editOrderMsg();
    }

测试结果:

可以有权限访问
获取订单成功
XXX 在 xxx 时候 对订单进行了访问

你有权限进行编辑
编辑订单成功
XXX 在 xxx 时候 对订单进行了编辑

因为我采用的随机数,测试结果也可能为:

可以有权限访问
获取订单成功
XXX 在 xxx 时候 对订单进行了访问

你没有权限,不能进行编辑

以上就是例子。

设计模式是种思维。

发布了60 篇原创文章 · 获赞 6 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/xiaoluo5238/article/details/104662510