Java设计模式之004--代理模式

代理模式(Proxy : 为其他对象提供一种代理以控制对这个对象的访问。
代理模式说白了就是“真实对象” 的代表, 在访问对象时引入一定程度的间接性, 因为这种间接性可以附加多种用途。

举例说明:操作员查询销售订单功能, 为了提高查询性能, 我们接入缓存功能, 如果缓存中有数据, 那么直接返回缓存中的数据,;如果缓存中没有数据, 那么查询订单数据后, 把数据加入到缓存, 这样在下次查询订单数据时, 就可以从缓存中读取了。

a.创建订单类、模拟的数据库类、模拟的缓存类;

//模拟的数据库类:提供getOrder方法来通过oid查询订单信息public class DB {    private static List<Order> list = new ArrayList<>();    static{        list.add(new Order(1,"毛巾3条",45,"2020-2-1"));        list.add(new Order(2,"小纸巾10包",12,"2020-1-21"));        list.add(new Order(3,"洗发水1瓶",32,"2020-1-30"));        list.add(new Order(4,"红牛1箱",36,"2020-2-2"));        list.add(new Order(5,"哈脾2箱",120,"2020-2-3"));    }

    public Order getOrder(int oid){        System.out.println("从数据库中查找数据...");        for(Order order:list){            if(order.getOid() == oid){                return order;            }        }        return null;    }}

//模拟的缓存类:提供getCache方法来通过oid查询订单信息; 提供putCache方法将订单信息存放到缓存中;public class Cache {
private Map<Integer,Order> map = new HashMap();    private volatile static Cache cache;

    private Cache(){    }

    //双检 + 单例模式    public static Cache getInstance(){        if (cache == null){            synchronized (Cache.class){                if (cache == null){                    cache = new Cache();                }            }        }        return cache;    }

    //把订单添加到缓存中    public void putCache(int key, Order value){        System.out.println("把订单数据添加到缓存中...");        map.put(key,value);    }

    //从缓存中获取订单    public Order getCache(int key){        System.out.println("从缓存中查询订单数据...");        return map.get(key);    }}

b.定义业务类(被代理的对象类)接口,以供业务类和代理类去实现

public interface OrderDao {    public Order queryOrder(int oid);}

c.定义业务类、代理类实现业务类(被代理的对象类)接口

public class OrderDaoImpl implements OrderDao {    @Override    public Order queryOrder(int oid) {        DB db = new DB();        Order order = db.getOrder(oid);        return order;    }}
public class OrderProxy implements OrderDao {    private OrderDao target;    //目标对象(被代理的对象)

    public OrderProxy (OrderDao target){        this.target = target;    }

    @Override    public Order queryOrder(int oid) {        Cache cache = Cache.getInstance();        Order order = cache.getCache(oid);  //从缓存中查订单(代理做了被代理对象额外的业务)        if (null == order){            order = target.queryOrder(oid); //从数据库中查订单(被代理对象的业务,方法名相同)            cache.putCache(order.getOid(),order);   //把订单放入缓存中        }        return order;    }}

测试对比:

public class Test {    public static void main(String[] args) {        OrderDaoImpl odi = new OrderDaoImpl();        Order order = odi.queryOrder(2);    //实际调用的是db.getOrder(oid)        System.out.println(order);        System.out.println("-------------------");        //查缓存        OrderProxy orderProxy = new OrderProxy(odi);        Order order1 = orderProxy.queryOrder(2);        System.out.println(order1);        System.out.println("----------第二次查询---------");        Order order2 = orderProxy.queryOrder(2);        System.out.println(order2);    }}
(0)

相关推荐

  • 内存不够用还要速度快,终于找到可以基于 File 的 Cache 了

    一:背景 1. 讲故事 18年的时候在做纯内存项目的过程中遇到了这么一个问题,因为一些核心数据都是飘在内存中,所以内存空间对我们来说额外宝贵,但偏偏项目中有些数据需要缓存,比如说需要下钻的报表上的点, ...

  • java设计模式基础--动态代理

    动态代理的意义在于生成一个代理对象,来代理真实对象,从而控制真实对象的访问.比如你是以为软件工程师,客户带着需求去找公司,显然不会直接和你谈,而是去找商务,此时客户认为商务就代表公司.商务(代理对象) ...

  • Java设计模式之003--工厂模式

    工厂模式(Factory Pattern) 是 Java 中最常用的设计模式之一. 这种类型的设计模式属于创建型模式, 它提供了一种创建对象的最佳方式. 在工厂模式中, 我们在创建对象时不会对客户端暴 ...

  • Java设计模式之002--策略模式

    策略模式(Strategy Pattern) :定义了一系列的算法, 将每一种算法封装起来并可以相互替换使用, 策略模式让算法独立于使用它的客户应用而独立变化. OO设计原则: 1.面向接口编程(面向 ...

  • 图解Java设计模式之中介者模式

    智能家庭项目 传统方案解决智能家庭管理问题 中介者模式基本介绍 中介者模式的原理类图 中介者模式 - 智能家庭的操作流程 中介者模式的注意事项和细节 智能家庭项目 1)智能家庭包括各种设备,闹钟.咖啡 ...

  • java设计模式之装饰器模式

    装饰器模式的定义: 装饰器模式也叫作包装器模式,指在不改变原有对象的基础上,动态地给一个对象添加一些额外的职责.就增加功能来说,装饰器模式相比生成子类更为灵活,属于结构性设计模式. 装饰器模式提供了比 ...

  • Java设计模式——代理模式

    代理模式 学习目标 掌握代理模式的应用场景和实现原理. 应用场景 保护目标对象:客户并不知道对象是如何实现具体业务功能的,只要调用代理对象的接口就行了. 增强目标对象:在实现目标对象的业务功能之前或者 ...

  • 设计模式(十三)——代理模式

    设计模式(十三)——代理模式

  • Java设计模式【命令模式】

    命令模式 命令模式很好理解,举个例子,司令员下令让士兵去干件事情,从整个事情的角度来考虑,司令员的作用是,发出口令,口令经过传递,传到了士兵耳朵里,士兵去执行.这个过程好在,三者相互解耦,任何一方都不 ...

  • PHP设计模式之代理模式

    PHP设计模式之代理模式 代理人这个职业在中国有另外一个称呼,房产经济人.保险经济人,其实这个职业在国外都是叫做房产代理或者保险代理.顾名思义,就是由他们来帮我们处理这些对我们大部分人来说都比较生疏的 ...