博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
设计模式之代理模式
阅读量:6486 次
发布时间:2019-06-23

本文共 1988 字,大约阅读时间需要 6 分钟。

一、定义

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

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

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

二、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

你可能感兴趣的文章
iOS开发之调用系统设置
查看>>
javascript 字符串转数字的简便写法
查看>>
Spring中jdbcTemplate的用户实例
查看>>
DecimalFormat 数据格式设置 SimpleDateFormat时间格式的用法介绍 --转载
查看>>
Android 的Margin和Padding属性以及支持的长度单位
查看>>
Django templates加载css/js/image等静态资源
查看>>
caffe solver
查看>>
Rhel6-heartbeat+lvs配置文档
查看>>
0317复利计算的回顾与总结
查看>>
函数对象
查看>>
最全最新个税计算公式---今天你税了吗?
查看>>
linux shell 正则表达式(BREs,EREs,PREs)差异比较(转,当作资料查)
查看>>
二分法求平方根(Python实现)
查看>>
使用startActivityForResult方法(转)
查看>>
so在genymotation中错误问题
查看>>
Visual Studio 原生开发的10个调试技巧(二)
查看>>
Windows内核再次出现0Day漏洞 影响win2000到win10所有版本 反病毒软件恐成瞎子
查看>>
H3C品牌刀片系统强势首发
查看>>
【CSS系列】图像映射
查看>>
First blood
查看>>