到红酒生产工厂购买红酒显然是不能实现的做法,接下来,我们创建红酒代理商类“RedWineProxy”,在该类中包含有红酒工厂的对象引用,如果代理类能够解决(有客户买红酒),就直接与客户交易,不能解决则交给真实对象红酒工厂处理。其具体内容如下所示:
package com.demo.proxy;//此包是存红酒代理商类和实现红酒工厂接口方法 import com.demo.real.IRedWine;
//红酒代理商实现红酒工厂的接口并且实现红酒接口中生产红酒与销售红酒的方法。 public class RedWineProxy implements IRedWine { //真正的红酒生产厂商
private final IRedWine redWine; //代理商出售红酒的权限
private final boolean permission =true; //默认构造方法
public RedWineProxy(IRedWine redWine) { }
//代理商生产红酒方法(代理商不生产红酒,从真正的生产工厂拿酒销售) @Override
public void product() {
// TODO Auto-generated method stub if(this.permission) { } else{
System.out.println(\这不是合法电红酒代理商!!!\); }}
//代理商有权限卖红酒代理权是合法的
System.out.println(\这是合法电红酒代理商!!!\);
System.out.println(\代理商接到订单,通知工厂生产。。。\); this.redWine.product(); this.redWine=redWine;
//判断代理商是否具有红酒代理权
//代理商销售红酒方法 @Override
public void sell() {
// TODO Auto-generated method stub if(this.permission) { } else{
System.out.println(\这是核发电红酒代理商!!!\);
this.redWine.sell();
System.out.println(\代理商从工厂拿到批发价红酒,然后以较高价格销售,
从中赚取一定的差价。。。\);
} }}
从上面可以看到,在红酒代理商中,构造方法将真实的红酒生产厂商对象实例引入,在红酒代理商的生产和销售红酒的方法中增加了代理商的判断,如果是合法的红酒代理商就可以进行红酒生产和销售,否则将不能进行生产和销售。 4.4 到红酒代理商处购买红酒
下面将可以看到Client应用程序是如何调用红酒代理商的。修改Client应用程序,具体内容如下:
package com.demo;//将此客户端程序放在此包中。
import com.demo.real.*;
import com.demo.real.impl.*;//将红酒接口和真实红酒工厂所在的包分别代入此包中,。
import com.demo.proxy.*;//代入存红酒代理商类和实现红酒工厂接口方法 //定义一个客户端类,,主应用程序 public class Client {
public static void main (String []args) { }
//创建真实的红酒工厂对象实例
IRedWine redRedWineFactory =new RealRedWineFactory(); //获得代理对象实例
IRedWine redWineProxy =new RedWineProxy(redRedWineFactory); //代理商生产红酒(其实真正生产的是工厂) redWineProxy.product();
//代理商销售红酒(批发价拿货,然后以较高价格出售,赚取差额利润) redWineProxy.sell(); }
在客户应用程序中,我们首先创建了一个真实的红酒生产厂商,然后传入到红酒代理商的对象实例中,最后,调用的是红酒代理商的生产和销售行为。
运行应用程序,结果如下所示:
这是合法电红酒代理商!!!
代理商接到订单,通知工厂生产。。。 红酒工厂生产红酒。。。 红酒工厂销售红酒。。
代理商从工厂拿到批发价红酒,然后以较高价格销售,从中赚取一定的差价。。。
此时,在红酒代理商中,我们可以增添附加行为,红酒代理商是客户和红酒生产工厂之间的一个桥梁。如果红酒代理商能够解决客户的需求,就直接解决,解决不了则交给红酒工厂解决。工程结构如图4-2所示。
图4-2工程结构图
上面红酒代理商的例子只是一个非常简单的代理模式的应用。其实,代理模式的应用不止这么简单,还有动态代理和面向方面编程(AOP)的内容,而且应用得非常广泛。比如,目前非常流行的Spring MVC框架中就大量应用了AOP技术。我们将在后面部分对动态代理和面向方面进行详细的讲解。
5.应用场景
那么代理模式的几种使用场景我们来看一看:
① 远程代理:为一个对象在不同地址空间提供局部代表。这样可以隐藏一个对象存在于不同地址空间的事实,例如:老阮(MrRuan)在地点A,老李在地点B,餐厅柜台也在地点B,那么老李和老软住在一起(都在地点A住),那么老李就是餐厅(地点B)在老软与老李住处(地点A)的代表。
② 虚拟代理:是根据需要创建开销很大的对象。通过它来存放实例化需要很长时间的真是对象,例如:老阮(MrRuan)在地点A,到餐厅柜台(地点B),因为距离远却是很费劲,而老李刚好在这里(地点B)上班,所以让老李去办是很可行的办法。(不太恰当) ③ 安全代理:用来控制真是对象访问时的权限,例如:老阮跟餐厅的柜台MM刚分手不方便去办理,所以需要借助老李去完成事项的办理。
④ 智能代理:是指当调用真是的对象时,代理去处理另外一些事情,例如:老李帮助老阮办理卡片激活时,顺便说说老阮的好话,让她俩能够和好。
6.总结
本文主要借助红酒代售的例子详细的介绍了代理模式的原理,从例子可以看出代理模
式有如下优缺点:
优点:1.职责清晰 2.高扩展性 3智能化
缺点:1.由于在客户端和真实主题之间增加了代理对象,因此有些
类型的代理模式可能会造成请求的处理速度变慢。2 实现代理模式需要额外的工作,有些代理模式的实现非常复杂。