资讯专栏INFORMATION COLUMN

设计模式之代理模式

enda / 2078人阅读

摘要:代理模式的定义来源于百度百科为其他对象提供一种代理以控制对这个对象的访问。二来源大话设计模式三例子实现现在根据上面购票代理的场景来实现例子接口,定义真实火车站,还有代理提供的服务。

一、定义

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

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

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

二、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://www.ucloud.cn/yun/7848.html

相关文章

  • PHP设计模式代理模式

    摘要:虚拟代理如果需要创建一个资源消耗较大的对象,先创建一个消耗相对较小的对象来表示,真实对象只在需要时才会被真正创建。虚拟代理通过使用一个小对象来代表一个大对象,可以减少系统资源的消耗,对系统进行优化并提高运行速度。 概念 代理模式(Proxy Pattern) :一种对象结构型模式。给某一个对象提供一个代理,并由代理对象控制对原对象的引用。 UML showImg(https://seg...

    zhisheng 评论0 收藏0
  • Spring框架我见(二)——代理模式

    摘要:聊完了工厂模式,下面我们来说框架中的另一个核心设计模式代理模式。这里的外卖小哥就相当于是我们的代理。主要分为代理和代理。 聊完了工厂模式,下面我们来说Spring框架中的另一个核心设计模式——代理模式(Proxy Pattern)。 代理模式 大家可以先不用看概念,先举个吃饭的例子:比如说我们想吃饭,我们可以选择自己做饭吃、去饭店吃、叫外卖吃。如果我们选择自己做着吃,我们就需要去买菜、...

    oneasp 评论0 收藏0
  • 设计模式代理模式

    摘要:虚拟代理虚拟代理把一些开销很大的对象,延迟到真正需要它的时候才去创建。主要参考设计模式与开发实践 设计模式 在面向对象软件设计过程中针对特定问题的简洁而优雅的解决方案。 这是在《设计模式》一书中对设计模式的定义。在软件开发过程中,我们可能会遇到过这样的情况,我们现在发现一个问题,和以前的某个问题很相似,几乎可以用统一套解决方案,而且我们还发现,在某个条件下,这个解决方案几乎就是通用的,...

    Gilbertat 评论0 收藏0
  • Javascript设计模式——代理模式

    摘要:最近在读设计模式与开发实践,在这里把文中的各种设计模式写出来,以便加深记忆,也可以分享给初学者。经纪人可以全权代表明星和客户谈判,最后把谈判结果给明星,明星决定签约与否。这也违反了面向对象设计原则中的单一职责原则。 最近在读《javascript设计模式与开发实践》,在这里把文中的各种设计模式写出来,以便加深记忆,也可以分享给初学者。如果你不了解设计模式,那么强烈推荐你阅读一下这本书,...

    cuieney 评论0 收藏0
  • JS设计模式代理模式

    摘要:什么是代理模式代理模式,类似于明星的经纪人,想要拜访明星,需要先通过经纪人的沟通。不同于装饰器,那种动态加载一个对象,可以说在代理模式当中,代理是早已既定的。又称单一功能原则,面向对象五个基本原则之一。 什么是代理模式 代理模式,类似于明星的经纪人,想要拜访明星,需要先通过经纪人的沟通。而在JS当中,如果想访问一个类,需要通过另一个类来间接访问 。不同于装饰器,那种动态加载一个对象,可...

    widuu 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<