两种软件设计模式案例分析_第1页
两种软件设计模式案例分析_第2页
两种软件设计模式案例分析_第3页
已阅读5页,还剩21页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、摘要本学期我学习了“设计模式 - 可复用面向对象软件的基础”这门课程, 这次我采用的是命令模式 + 策略模式两种设计模式结合的案例。分析的案例为:遥控器控制天花板上的吊扇,它有多种转动速度,当 然也允许被关闭。假设吊扇速度:高、中、低 、关闭。采用安全模式 + 策 略设计模式。报告整体结构为:两种设计模式的分析、理解,类图,实例分析、代 码分析,总结。目录第一章 命令模式 + 策略模式 1.1.1 命令模式 11.1.1 定义 11.1.2 命令模式的结构 角色 11.1.4 优点 21.1.5 缺点 31.5.6 适用情况 3.1.2 策略模式 32.1.1 意图 32.2.

2、2 主要解决问题 3.如何解决 4.关键代码 优点 42.2.7 缺点 42.2.8 使用场景 注意事项 5.第二章 案例分析 62.1 类图 62.2 测试分析 62.3 代码分析 82.2.1 命令模式模块代码 策略模式模块代码 1.7.第三章 总结 2.2.第一章 命令模式 + 策略模式本案例用到的两种案例为安全模式 + 策略模式,因此在分析案例之前我 先对两种设计模式进行分析。命令模式具体实现命令调控,策略模式定义 一系列的算法 ,把它们一个个封装起来。1.1 命令模式1.1.1 定义将来自客户端的请求传入一个对象,从而使你可用不同的请求

3、对客户 进行参数化。用于“行为请求者”与“行为实现者”解耦,可实现二者之 间的松耦合,以便适应变化。分离变化与不变的因素。1.1.2 命令模式的结构命令模式是对命令的封装。命令模式把发出命令的责任和执行命令 的责任分割开,委派给不同的对象。每一个命令都是一个操作: 请求的一方发出请求要求执行一个操作; 接收的一方收到请求,并执行操作。命令模式允许请求的一方和接收的一 方独立开来,使得请求的一方不必知道接收请求的一方的接口,更不必知 道请求是怎么被接收,以与操作是否被执行、何时被执行,以与是怎么被 执行的。1.1.3 角色Command定义命令的接口,声明执行的方法。ConcreteComman

4、d命令接口实现对象,是“虚”的实现;通常会持有接收者,并调用接 收者的功能来完成命令要执行的操作。Receiver接收者,真正执行命令的对象。任何类都可能成为一个接收者,只要 它能够实现命令要求实现的相应功能。Invoker要求命令对象执行请求,通常会持有命令对象,可以持有很多的命令 对象。这个是客户端真正触发命令并要求命令执行相应操作的地方,也就 是说相当于使用命令对象的入口。Client创建具体的命令对象,并且设置命令对象的接收者。注意这个不是我 们常规意义上的客户端,而是在组装命令对象和接收者,或许,把这个 Client 称为装配者会更好理解,因为真正使用命令的客户端是从 Invoker

5、 来触发执行。1.1.4 优点1. 降低对象之间的耦合度。2. 新的命令可以很容易地加入到系统中。3. 可以比较容易地设计一个组合命令。4. 调用同一方法实现不同的功能1.1.5 缺点使用命令模式可能会导致某些系统有过多的具体命令类。因为针对每 一个命令都需要设计一个具体命令类,因此某些系统可能需要大量具体命 令类,这将影响命令模式的使用。1.5.6 适用情况1. 系统需要将请求调用者和请求接收者解耦, 使得调用者和接收者不直 接交互。2. 系统需要在不同的时间指定请求、将请求排队和执行请求。3. 系统需要支持命令的撤销 (Undo) 操作和恢复 (Redo) 操作。4. 系统需要将一组操作组

6、合在一起,即支持宏命令。1.2 策略模式2.1.1 意图定义一系列的算法 ,把它们一个个封装起来 , 并且使它们可相互替换。2.2.2 主要解决问题在有多种算法相似的情况下, 使用 if.else 所带来的复杂和难以维护。2.2.3 何时使用一个系统有许多许多类,而区分它们的只是他们直接的行为。2.2.4 如何解决将这些算法封装成一个一个的类,任意地替换。2.2.5 关键代码实现同一个接口。应用实例: 1 、诸葛亮的锦囊妙计,每一个锦囊就是一个策略。 2、 旅行的出游方式, 选择骑自行车、 坐汽车, 每一种旅行方式都是一个策略。 3、 JAVA AWT 中的 LayoutManager 。2.

7、2.6 优点1、算法可以自由切换。2、避免使用多重条件判断。3、扩展性良好。2.2.7 缺点1、策略类会增多。2、所有策略类都需要对外暴露。2.2.8 使用场景1、如果在一个系统里面有许多类, 它们之间的区别仅在于它们的行为,那么使用策略模式可以动态地让一个对象在许多行为中选择一种行为。2、一个系统需要动态地在几种算法中选择一种。3、如果一个对象有很多的行为,如果不用恰当的模式,这些行为就只 好使用多重的条件选择语句来实现。2.2.9 注意事项如果一个系统的策略多于四个,就需要考虑使用混合模式,解决策略 类膨胀的问题。第二章 案例分析本文分析的案例为:遥控器控制天花板上的吊扇, 它有多种转动速

8、度, 当然也允许被关闭。假设吊扇速度:高、中、低、关闭。采用安全模式+策略设计模式。2.1类图2.2测试分析本案例运行测试如下,通过控制高档,中档,低档,三个命令来控制分扇转动的速度,如图2-1,2-2,2-3所示图2-1高档风速命令阍设计巫- X|鬲档|中町|儒档中凤塔已经打开图2-2中档风速命令图2-3低档风速命令2.3代码分析本案例以先以命令模式实现三个命令,再以策略模式定义算法实现, 具体实现代码如下:命令模式模块代码I.Command 类 执行命令的接口package comma nd;public in terface Comma nd public String execute。

9、; public Str ing un do();2.NoComma nd类package comma nd;public class NoComma nd impleme nts Comma ndpublic Str ing un do() return n ull;Overridepublic Str ing execute。 return n ull;3. RemoteLoader 类加载package comma nd;import javax.swi ng.JButt on;import javax.sw in g.JFrame;import javax.swi ng.JLabel;

10、import javax.swi ng.JScrollBar;impleme ntspublic class RemoteLoaderexte ndsJFrameActi on Liste ner private JButton high;private JButton middle;private JButton low;private JLabel text;public RemoteLoader() super("设计模式");setSize(300, 200);setVisible(true);Container pane = getC onten tPa ne()

11、;FlowLayout flo = new FlowLayout();pan e.setLayout(flo);high = new JButton(" 高档");high.addActio nListe ner(this);middle = new JButton(”中档");middle.addActi on Liste ner(this);text = new JLabel();low = new JButto n(" 低档"); low.addActio nListe ner(this);pan e.add(high);pan e.ad

12、d(middle);pan e.add(low);pan e.add(text);setC onten tPa ne(pa ne); setVisible(true);public void acti on Performed(Acti on Eve nt e) if (e.getSource() = high) high.setBackgro un d(Color.cya n);Con text1( newCon text1con text1= newOperati on Gao1();String executeStrategygao = con text1.executeStrategy

13、();text.setText(executeStrategygao);middle.setBackgro und(n ull);low.setBackgro un d( null);if (e.getSource() = middle) middle.setBackgro un d(Color.cya n);Con text1con text1= newCon text1( newOperati on Gao1();con text1 = new Con text1( new Operatio nZhon g1();StringexecuteStrategyzh ongcon text1.e

14、xecuteStrategy();text.setText(executeStrategyzh on g);high.setBackgro und(n ull);low.setBackgro un d( null);if (e.getSource() = low) low.setBackgro un d(Color.cya n);Con text1con text1= newCon text1( newOperati on Gao1();con text1 = new Con text1( new Operati on Di1();String executeStrategylow = con

15、 text1.executeStrategy();text.setText(executeStrategylow);high.setBackgro und(n ull);middle.setBackgro und(n ull);4. RemoteCo ntrol 类package comma nd;public class RemoteCo ntrol Comma nd comma nd;public RemoteC on trol () Comma nd no Comma nd = new NoComma nd(); comma nd = no Comma nd;public void se

16、tComma nd(Comma nd comma nd) ma nd = comma nd;public Stri ng butt on WasPushed() retur n comma nd.execute();public void un doButt on WasPushed() comma nd.un do();5. GaoCommand类高风速命令package comma nd;public class GaoComma nd impleme nts Comma nd Overridepublic Str ing execute。/ TODO Auto-ge nerated me

17、thod stub return "高风挡已经打幵"Overridepublic Str ing un do() / TODO Auto-ge nerated method stubretur n "Gaocomma nd un do"6. ZhongCommand类中风速命令package comma nd;public class Zhon gComma nd impleme nts Comma nd Overridepublic Str ing execute。return "中风挡已经打幵”Overridepublic Str ing

18、un do() / TODO Auto-ge nerated method stub retur n"Zh on gcomma nd un do"7. DiCommand 类低风速命令package comma nd;public class DiComma nd impleme nts Comma nd Overridepublic Str ing execute。/ TODO Auto-ge nerated method stub return "低风挡已经打幵"Overridepublic Str ing un do() / TODO Auto-g

19、e nerated method stub retur n"Dicomma nd un do"策略模式模块代码1.Strategy1 类 创建一个接口:package comma nd;public in terface Strategy1 public Str ing doOperatio n();2.OperationGaol 类实现接口的高风速实体类package comma nd;import comma nd.Comma nd;import comma nd.GaoComma nd;import comma nd.RemoteC on trol;public cl

20、ass Operatio nGaol impleme nts Strategy1Overridepublic Str ing doOperati on() RemoteC on trol rc = new RemoteC on trol();Comma nd gaoComma nd = new GaoComma nd();rc.setComma nd(gaoComma nd);retur nrc.butt on WasPushed();3.OperationZhong1类 实现接口的中风速实体类package comma nd;import comma nd.Comma nd;import c

21、omma nd.RemoteC on trol;import comma nd.Zh on gComma nd;public class Operatio nZhongl impleme nts Strategyl Overridepublic Str ing doOperati on() / TODO Auto-ge nerated method stubRemoteC on trol rc = new RemoteC on trol();Comma nd zhon gComma nd = new Zhon gComma nd();rc.setComma nd(zh on gComma nd

22、);retur n rc.butt on WasPushed();3.OperationDil类实现接口的低风速实体类package comma nd;import comma nd.Comma nd;import comma nd.DiComma nd;import comma nd.RemoteC on trol;public class Operatio nDil impleme nts Strategyl Overridepublic Str ing doOperati on() RemoteC on trol rc = new RemoteC on trol(); Comma nd diComma nd = new DiComma nd(); rc.setComma nd(diComma nd);retur n rc.butt on WasPushed();4.C on textl类package comma nd; public class Con textl private Strategyl strategyl;public Con text1(Strategy1 strategy1) this.strategy1 =

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论