两种软件设计模式案例分析.doc

上传人:scccc 文档编号:13194797 上传时间:2021-12-18 格式:DOC 页数:26 大小:212KB
返回 下载 相关 举报
两种软件设计模式案例分析.doc_第1页
第1页 / 共26页
两种软件设计模式案例分析.doc_第2页
第2页 / 共26页
两种软件设计模式案例分析.doc_第3页
第3页 / 共26页
亲,该文档总共26页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述

《两种软件设计模式案例分析.doc》由会员分享,可在线阅读,更多相关《两种软件设计模式案例分析.doc(26页珍藏版)》请在三一文库上搜索。

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

2、2 主要解决问题 3.如何解决 4.关键代码 4.2.2.6 优点 42.2.7 缺点 42.2.8 使用场景 5.2.2.9 注意事项 5.第二章 案例分析 62.1 类图 62.2 测试分析 62.3 代码分析 82.2.1 命令模式模块代码 8.2.2.2 策略模式模块代码 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

23、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 = strategy1;public Stri ng executeStrategy()returnstrategy1.doOperatio n();尺

24、代j、/:第三章 总结首先真诚的感谢郭老师的认真讲解,同学们的热心帮助,让我学到了 很多。刚开始学习设计模式的时候,感到这些模式真的非常抽象。后来随 着郭老师的讲解,以与在同学们的帮助下我慢慢学会了一些设计模式,简 单理解了设计模式的概念。在本次的作业中,我使用的是含有命令模式和策略模式的案例。经过 这次的作业,不仅让我多这两种模式有了很好的理解,更重要的是我对整 个设计模式都有了一定的了解。命令模式就是将来自客户端的请求传入一个对象,从而使你可用不同的请求对客户进行参数化。用于“行为请求者”与“行为实现者”解耦, 可实现二者之间的松耦合,以便适应变化。策略模式就是定义一系列的算 法 ,把它们

25、一个个封装起来, 并且使它们可相互替换。设计模式, 它给出了很多设计中的技巧与思路, 对于很多优秀的设计,它加以总结与提炼。设计模式并非四人团拍脑瓜想出来的,而是他们搜集 了其他人优秀的设计,加以整理出来的,他们不是这些模式的创造者,仅 仅是整理者。应用设计模式会给我们带来很多好处:软件将变得更加灵活,模块之 间的耦合度将会降低,效率会提升,开销会减少。更重要的,设计模式就 好像美声唱法中的花腔,让你的设计更加漂亮。总的来说,设计模式似乎 将软件设计提升到艺术的层次设计模式已经被广泛的应用了,在现在很多的图形界面框架都使用了 MVC 模式,大量跌代器模式的应用,彻底改变了我们对集合的操作方式。 不仅如此,应用了设计模式的设计,往往被看成为优秀的设计。最后再一次感谢郭老师为我们讲解设计模式,郭老师也一直在和我们 一起学习,一起进步,希望您身体健康,家庭幸福。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 社会民生


经营许可证编号:宁ICP备18001539号-1