代理模式

一、定义

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

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

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

二、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
来源:掘金
原文地址:https://www.cnblogs.com/zhouheblog/p/10945047.html