内容简介:在网络不发达之前,我们买火车票,通常都需要跑到火车站去买。这对于我们来说可能有些麻烦,偶然有一天,你发现你楼下有一家便利店居然能买火车票,这就方便很多。其实啊,便利店并不提供火车服务,也没有权利发行火车票,所以它只是提供了代理,代理了火车站的购票服务,这就是一种代理模式。从定义了,我们就可以知道代理模式的作用了,提供对真实对象的代理,可以达到对访问真实对象的控制,起到中介的作用。
一、定义
在网络不发达之前,我们买火车票,通常都需要跑到火车站去买。这对于我们来说可能有些麻烦,偶然有一天,你发现你楼下有一家便利店居然能买火车票,这就方便很多。其实啊,便利店并不提供火车服务,也没有权利发行火车票,所以它只是提供了代理,代理了火车站的购票服务,这就是一种代理模式。
代理模式的定义(来源于百度百科) :为其他对象提供一种代理以控制对这个对象的访问。在某些情况下,一个对象不适合或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用。
从定义了,我们就可以知道代理模式的作用了,提供对真实对象的代理,可以达到对访问真实对象的控制,起到中介的作用。
二、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、智能指引
比如说上面购买车票,可能购买车票还得先录入省份证信息等其他操作。我们其实不想知道得干嘛,我们的目的很简单就是买到一张票。代理卖票服务的便利店会帮我们完成这一系列的操作包括:录入省份证信息+买票。
五、总结说明
需要注意的是,以上编写的为静态代理,即代码运行前代理类就已经是编写好的了,至于动态代理,代理类是在运行时才生成的,这里先不做介绍,后续会另外的文章介绍。代理模式本质上就是通过代理对象来对真实对象的访问,那么为什么不直接掉真实对象呢??那时因为调真实对象前,我们还需要做其他操作,这个操作又不属于真实对象提供的服务。业务上,他并不属于真实对象。比如说调用前做安全验证、或者组合几个操作。
以上所述就是小编给大家介绍的《设计模式之代理模式》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
PHP for the World Wide Web, Second Edition (Visual QuickStart Gu
Larry Ullman / Peachpit Press / 2004-02-02 / USD 29.99
So you know HTML, even JavaScript, but the idea of learning an actual programming language like PHP terrifies you? Well, stop quaking and get going with this easy task-based guide! Aimed at beginning ......一起来看看 《PHP for the World Wide Web, Second Edition (Visual QuickStart Gu》 这本书的介绍吧!