高级软件工程
代理模式
姓 名 : 刘自强 班 级 : 信息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 红酒工厂接口——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 创建红酒代理商