zoukankan      html  css  js  c++  java
  • 代理模式

    一、定义

           在网络不发达之前,我们买火车票,通常都需要跑到火车站去买。这对于我们来说可能有些麻烦,偶然有一天,你发现你楼下有一家便利店居然能买火车票,这就方便很多。其实啊,便利店并不提供火车服务,也没有权利发行火车票,所以它只是提供了代理,代理了火车站的购票服务,这就是一种代理模式。

    代理模式的定义(来源于百度百科):为其他对象提供一种代理以控制对这个对象的访问。在某些情况下,一个对象不适合或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用。

    从定义了,我们就可以知道代理模式的作用了,提供对真实对象的代理,可以达到对访问真实对象的控制,起到中介的作用。

    二、UML

    来源:《大话设计模式》

    三、例子实现

    现在根据上面购票代理的场景来实现例子

    1、接口,定义真实火车站,还有代理提供的服务。

    package com.design.proxy;
    public interface TrainServiceInf {  
      
        public void saleTicket();
    }

    2、火车站类,真正提供买票服务

    package com.design.proxy;
    /** * 被代理的真实对象 */
    public class TrainStation implements TrainServiceInf {    
    
        @Override    
        public void saleTicket() 
        {        
            System.out.println("今天心情好,卖给你一张票!");    
        }
    }

    3、定义代理类,持有真实对象的引用

    package com.design.proxy;public 
    
    class TrainProxy implements TrainServiceInf{    
    
        private TrainServiceInf trainServiceInf;
        
        public TrainProxy(){        
            trainServiceInf = new TrainStation();    
        }    
        @Override    
        public void saleTicket() {        
            System.out.println("购票还跑去火车站,你out了,跑去了也不一定卖给你,给点手续费,我保证帮你买到!!");        
            //真正去购票
            trainServiceInf.saleTicket();    
        }
    }

    客户端调用

    package com.design.proxy;
    public class TestMain {    
        public static void main(String[] args) {        
            TrainServiceInf trainProxy = new TrainProxy(); 
            //通过代理类来买票       
            trainProxy.saleTicket();    
        }
    }

    四、应用场景

    1、远程代理

    为一个对象在不同的地址空间提供局部代表,隐藏一个对象在不同地址空间的事实。这个在远程调用中,是个很明显的体现。比如我们通过一个对象来代理远程服务,调用这个对象的方法,则会相应的调用远程的方法。所以该对象为远程服务的一个代理。

    2、虚拟代理

    需要创建开销大的对象,通过它来存放实例化需要很长时间的真实对象。

    3、安全代理

    用来控制真实对象访问时的权限,如上面的购票例子中,我们可以在购票方法上加入一个身份证号码参数,客户端传过来省份证号码,代理类里面进行验证,发现省份证为老赖的,则不让购票【手动滑稽】

    4、智能指引

    比如说上面购买车票,可能购买车票还得先录入省份证信息等其他操作。我们其实不想知道得干嘛,我们的目的很简单就是买到一张票。代理卖票服务的便利店会帮我们完成这一系列的操作包括:录入省份证信息+买票。

    五、总结说明

    需要注意的是,以上编写的为静态代理,即代码运行前代理类就已经是编写好的了,至于动态代理,代理类是在运行时才生成的,这里先不做介绍,后续会另外的文章介绍。代理模式本质上就是通过代理对象来对真实对象的访问,那么为什么不直接掉真实对象呢??那时因为调真实对象前,我们还需要做其他操作,这个操作又不属于真实对象提供的服务。业务上,他并不属于真实对象。比如说调用前做安全验证、或者组合几个操作。


    链接:https://juejin.im/post/5ce50ca8e51d455ca04361ac
    来源:掘金
  • 相关阅读:
    通配符
    Hibernate入门简介
    Java的参数传递是值传递?
    Java线程详解
    java基础总结
    谈谈对Spring IOC的理解
    Oracle SQL语句之常见优化方法总结--不定更新
    JVM 工作原理和流程
    Java中的String为什么是不可变的? -- String源码分析
    Spring AOP 简介
  • 原文地址:https://www.cnblogs.com/zhouheblog/p/10945047.html
Copyright © 2011-2022 走看看