高级软件工程

更新时间:2023-12-17 05:51:01 阅读量: 教育文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

高级软件工程

代理模式

姓 名 : 刘自强 班 级 : 信息18班

号 : 2014517

1.模式定义

软件模式分为三大类:创建型模式(Creational Pattren)、结构型模式(Structural Patterm)和行为型模式(Behavioral Pattern),都是用于解决软件设计开发上的特定问题。本文主要结合面向对象程序设计思想说明结构型模式中的一种基本的设计模式——代理设计模式(Proxy Pattern)。结构型设计模式是关注于如何将类和对象组合成更大的结构。结构型模式是使用继承来组合接口或者实现的。而在结构型设计模型中7种设计模式都是以对象的适配器模式为起源,如图1-1所示。 (3)代理设计模式 接口的适配器设计模式 (6)桥接设计模式 (2)装饰设计模式 (1)适配器模式 类的适配器设计模式 对象的适配器设计模式 (5)桥接设计模式 (4)外观设计模式 (7)桥接设计模式 图1-1结构型设计模式图 2.模式分析 本文针对代理设计模式进行论述,代理设计模式(Proxy Pattern),是软件设计模式中的一项基本技巧,在代理设计模式中,有两个对象参与处理同一请求,接收的请求可以由代理对象委托给真实对象进行处理,代理对象控制请求的访问,它在客户应用程序与真实目标对象之间起到了一个中介桥梁的作用。代理设计模式使用对象聚合代替继承,可以有效地降低了软件模块之间的耦合度。 在代理设计模式中,一共可以关系到的角色有以下三大类。 (1)抽象角色:声明真实对象和代理对象的共同接口。 (2)真实角色:真正处理客户请求的目标对象。 (3)代理角色:代理对象角色内部包含有真实对象的引用,从而代理对象可以将请求转为真实对象处理。同时,代理对象在执行真实对象操作的前后还可以添加附加操作。 3. 实例分析 下面举一个例子对代理设计模式进行分析,以消费者购买红酒为例,红酒厂商可以在工厂生产红酒,红酒厂商也可以把红酒批发给代理商,而代理商还可以把批发来的红酒卖给客户(消费者)。因此消费者只需要和红酒代理商打交道就行了,不必到红酒生产厂商那里购买。代理商如果有,就可以直接买,没有则可以通过代理商进行购买。从生产厂商到代理经销商再到消费者,红酒的价格可以说是一路向上看的,打个比方,一瓶红酒出厂价格10元,到了代理商这里,由于运费、店面租金、营业税等因素影响,需要提高50%,而且代理商可能还要从中获得一定的利润,这样还要在提高50%,如此下来,红酒的价格卖到消费者手中可能就要20元。那么消费者购买红酒的过程如下: (1)找到红酒的代理商; (2)代理商有客户想买的红酒,则直接卖给客户,否则下订单到红酒生产厂家; (3)红酒生产厂家生产红酒批发给代理商。 这个过程比较容易理解。如果代理商存在客户想买的红酒,就可以直接交易:如果代理商没有客户想要的红酒,则下订单通知红酒生产厂家,然后,红酒生产厂家生产红酒批发给代理商,最后,再由代理商卖红酒给客户。静态关系如图所示。 <> 红酒生产接口 +生产() +销售() 红酒代理商 红酒生产厂家 -红酒工厂:红酒生产厂家 +生产() 1 1 1 1 +生产() +销售() +销售() Client 如图 红酒代理商静态关系图 从红酒代理商的静态关系图中,我们可以清晰地看到,客户只与代理商之间进行购买交易,而不与实际的红酒生产厂家发生任何关系。 4. 模式实现 根据以上论述,下面根据红酒代理商静态关系图对模式进行实现。 打开Eclipse;新建Java工程“ProxyDemo”,然后创建一下包结构: (1)新建“com.demo.real”包结构,用于存放真实的红酒生产厂商角色: (2)新建“com.demo.proxy”包结构,用于存放红酒代理商角色。 4.1 创建红酒生产厂商

1 红酒工厂接口——IRedWine

首先,创建生产红酒接口“IRedWine”,该接口含有两个方法:生产红酒和销售红酒。内容如下所示:

package com.demo.real;//把红酒接口放在此包中。

//定义一个红酒接口,包括两个方法:一个是生产红酒。另一个是销售红酒方法。 public interface IRedWine { }

//生产红酒方法

public void product(); //销售红酒方法 public void sell();

2 红酒工厂实现——RealReadWineFactory

接下来,我们创建真实的红酒生产实现类“RealReadWineFactory”,实现IRedWine接口。该实现类即红酒生产厂商,内容如下所示;

package com.demo.real.impl;//把真实生产红酒工厂放在此包中,

import com.demo.real.IRedWine;//将此包中的红酒接口导入此包中。

//真正的生产红酒工厂,此类是实现红酒接口的。同时也实现生产红酒的方法 和销售红酒的方法。

public class RealRedWineFactory implements IRedWine { }

@Override

public void product() { }

@Override

//红酒销售方法实现 public void sell() { }

// TODO Auto-generated method stub //生产红酒方法实现

// TODO Auto-generated method stub

System.out.println(\红酒工厂生产红酒。。。\);

System.out.println(\红酒工厂销售红酒。。\);

4.2 到红酒工厂购买红酒

红酒工厂已经建立起来了,现在你可以直接到工厂买到想要的红酒了。我们先来看看直接到工厂买红酒的过程吧!创建Client客户端应用程序,内容如下所示; package com.demo;//将此客户端程序放在此包中。

import com.demo.real.*;

import com.demo.real.impl.*;//将红酒接口和真实红酒工厂所在的包分别代入此包中,。 //定义一个客户端类,,主应用程序 public class Client {

public static void main (String []args) { } }

//创建红酒生产工厂1

IRedWine redWine =new RealRedWineFactory(); //工厂生产红酒1 redWine.product(); //工厂销售红酒1 redWine.sell(); //创建红酒生产工厂2

IRedWine redWine1 =new RealRedWineFactory(); //工厂生产红酒2 redWine1.product(); //工厂销售红酒2 redWine1.sell();

此工程结构如图4-1所示

图4-1 工程结构图 运行应用程序,程序结果如下所示; 红酒工厂生产红酒。。。

红酒工厂销售红酒。。

红酒工厂一实现生产红酒和销售红酒的方法 红酒工厂生产红酒。。。 红酒工厂销售红酒。。

红酒工厂二实现生产红酒和销售红酒的方法

此时我们的应用程序可以让红酒工厂生产红酒进而销售红酒了。那么接下来编写红酒代理商程序。

4.3 创建红酒代理商

到红酒生产工厂购买红酒显然是不能实现的做法,接下来,我们创建红酒代理商类“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 实现代理模式需要额外的工作,有些代理模式的实现非常复杂。

本文来源:https://www.bwwdw.com/article/jhf5.html

Top