01 设计模式示例讲解(Command命令模式)(1).pdf

上传人:asd****56 文档编号:69697983 上传时间:2023-01-07 格式:PDF 页数:56 大小:768.83KB
返回 下载 相关 举报
01 设计模式示例讲解(Command命令模式)(1).pdf_第1页
第1页 / 共56页
01 设计模式示例讲解(Command命令模式)(1).pdf_第2页
第2页 / 共56页
点击查看更多>>
资源描述

《01 设计模式示例讲解(Command命令模式)(1).pdf》由会员分享,可在线阅读,更多相关《01 设计模式示例讲解(Command命令模式)(1).pdf(56页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。

1、Version 1.0周甫()设计模式设计模式示例讲解示例讲解命令模式命令模式(1)PDF 文件使用 pdfFactory Pro 试用版本创建 周甫()2 2课程介绍课程介绍 本课程主要讲授本课程主要讲授本课程主要讲授本课程主要讲授命令模式命令模式命令模式命令模式基础知识基础知识基础知识基础知识 适用于适用于适用于适用于JavaJava开发工程师开发工程师开发工程师开发工程师 面向的学员是面向的学员是面向的学员是面向的学员是对对对对ServletServlet,JSPJSP有基本了有基本了有基本了有基本了解的解的解的解的J2EEJ2EE开发工程师开发工程师开发工程师开发工程师 全部课程时间大

2、约是全部课程时间大约是全部课程时间大约是全部课程时间大约是4040分钟分钟分钟分钟PDF 文件使用 pdfFactory Pro 试用版本创建 周甫()3 3概 要概 要命令模式的语意描述命令模式的优点命令模式中的角色命令模式实例PDF 文件使用 pdfFactory Pro 试用版本创建 周甫()4命令模式命令模式命令模式属于对象的行为模式,又称为行动模式或者交易模式。封装在一个对象中,命令模式允许系统使用不同的请求把客户端参数化,对请求排对或者记录请求日志,可以提供命令的撤销和恢复功能PDF 文件使用 pdfFactory Pro 试用版本创建 周甫()5命令模式的语意描述命令模式的语意描

3、述命令模式是对命令的封装,命令模式把发出命令的责任和执行命令的责任分割开,委派给不同的对象。、命令:一个操作;、发命令者:发出一个请求,要求执行一个操作;、接收方:收到请求,执行操作;、命令模式允许请求的一方和接收的一方独立开来,使得请求的一方不必知道接收请求的一方的接口,更不必知道请求是怎么被接收以及操作是否被执行、何时执行、如何执行的;PDF 文件使用 pdfFactory Pro 试用版本创建 周甫()6命令模式的优点命令模式的优点命令允许请求的一方和接收请求的一方能够独立演化,从而具有以下优点:、命令模式使新的命令很容易的被加到系统里;、允许接收请求的一方决定是否要否决请求;、能够较容

4、易的设计一个命令队列;、可以很容易的实现对一个命令的Undo和Redo;、在需要的情况下可以很容易的将命令记入日志;在C语言中命令模式便是面向对象形式的回呼(Callback)。PDF 文件使用 pdfFactory Pro 试用版本创建 周甫()7命令模式中的角色命令模式中的角色1.客户角色:创建一个具体命令对象,并确定其接收者;2.命令角色:声明了一个所有具体命令类的抽象接口,这是一个抽象角色,通常由一个Java接口或者一个Java抽象类事项;3.具体命令角色:定义接收者和行为之间的一个弱藕合,实现执行方法,负责调用接收者的相应操作。4.请求者角色:负责调用命令对象执行请求,相关的方法叫做

5、行动方法;5.接收者角色:负责具体实施和执行一个请求。任何一个类都可以称为接收者,实施和执行请求的方法叫行动方法PDF 文件使用 pdfFactory Pro 试用版本创建 周甫()8示意性使用举例示意性使用举例系统的结构图:PDF 文件使用 pdfFactory Pro 试用版本创建 周甫()9客户角色源代码客户角色源代码public class Clientpublic static void main(String args)Receiver receiver=new Receiver();Command command=new ConcreteCommand(receiver);Inv

6、oker invoker=new Invoker(command);invoker.action();PDF 文件使用 pdfFactory Pro 试用版本创建 周甫()10请求者角色源代码请求者角色源代码public class Invokerprivate Command command;public Invoker(Command command)mand=command;public void action()command.execute();PDF 文件使用 pdfFactory Pro 试用版本创建 周甫()11接收者角色源代码接收者角色源代码public class Rece

7、iverpublic Receiver()/write code herepublic void action()System.out.println(Action has been taken.);PDF 文件使用 pdfFactory Pro 试用版本创建 周甫()12抽象命令角色源代码抽象命令角色源代码public interface Commandvoid execute();PDF 文件使用 pdfFactory Pro 试用版本创建 周甫()13具体命令角色源代码具体命令角色源代码public class ConcreteCommand implements Commandpriv

8、ate Receiver receiver;public ConcreteCommand(Receiver receiver)this.receiver=receiver;public void execute()receiver.action();PDF 文件使用 pdfFactory Pro 试用版本创建 周甫()14命令模式的活动序列命令模式的活动序列1.客户端指明一个具体命令ConcreteCommand,并指明接收者;2.请求者对象保存了ConcreteCommand对象;3.请求者对象通过调用action()方法发出请求,如果命令是能够撤销的,那么ConcreteCommand保存

9、了调用execute()方法之前的状态;4.ConcreteCommand对象调用接收的一方的方法执行请求;PDF 文件使用 pdfFactory Pro 试用版本创建 周甫()15命令模式的活动时序图命令模式的活动时序图PDF 文件使用 pdfFactory Pro 试用版本创建 周甫()16命令模式的实现命令模式的实现命令的“轻”与“重”:1.命令设计得“轻”一些:命令只是提供了一个请求者和接收者之间的藕合而已,命令代表请求者实现请求;2.命令设计得“重”一些:命令应当实现所有的细节,包括请求所代表操作而不再需要接收者;3.最“轻”和最“重”之间:命令类可以动态地决定调用哪一个接收者类;P

10、DF 文件使用 pdfFactory Pro 试用版本创建 周甫()17命令模式的实现命令模式的实现关于是否支持Undo和Redo如果一个命令类提供一个方法,比如叫UnExecute(),以恢复其操作的效果,那么命令类就可以支持Undo和Redo。此时具体命令类需要存储的状态信息:、接收者对象实际上实施请求所代表的操作;、对接收者对象所作的操作所需要的参数;、接收者类最初的状态接收者必须提供适当的方法,使命令类可以通过调用这个方法,以便接收者类恢复原有状态PDF 文件使用 pdfFactory Pro 试用版本创建 周甫()18命令模式的实现命令模式的实现、如果只需要提供一层的Undo和Red

11、o,那么系统只需要存储最后被执行的那个命令对象;、如果需要支持多层的Undo和Redo,那么系统就需要存储曾经被执行过的命令清单,清单能允许的最大长度便是系统所支持的Undo和Redo 的层数,沿着清单上的命令的反命令(UnExecute())就是undo,沿着清单上的命令顺序执行就是,就是redo。PDF 文件使用 pdfFactory Pro 试用版本创建 周甫()19使用命令模式的语意环境使用命令模式的语意环境1.命令模式作为“回呼”在面向对象系统中的替代。“回呼”一般是先将一个函数登记上,然后在以后调用此函数;2.需要在不同的时间指定请求、将请求排队。一个命令对象可以和原先的请求发出者

12、有不同的生命期。换言之,原先的请求发出者可能已经不在了,而命令对象本身仍然是活动的。这是命令的接收者可以在本地,也可以在网络上的另外一个地址,命令对象可以在串行化以后传送到另外一台机器上;3.一个系统需要支持交易,一个交易结构封装了一组数据更新命令,使用命令模式实现交易结构可以使系统增加新的交易类型;PDF 文件使用 pdfFactory Pro 试用版本创建 周甫()20使用命令模式的语意环境使用命令模式的语意环境、系统需要支持命令的撤销。命令对象可以把状态存储起来,等到客户端需要撤销命令所产生的效果时,可以调用undo()方法;把命令产生的效果撤销掉,命令对象还可以支持rendo()方法,

13、以供客户端在需要时,重新实施命令的效果;、如果一个系统要将系统中所有的数据更新到一个日志里,以便在系统崩溃时,可以跟据日志里的所有的数据更新命令,重新调用execute()方法,一条一条的调用这些命令,从而恢复系统在崩溃前所做的数据更新;PDF 文件使用 pdfFactory Pro 试用版本创建 周甫()21命令模式的优缺点命令模式的优缺点优点:v命令模式把请求一个操作的对象与知道怎么执行一个操作的对象分隔开;v命令类和其它别的类一样可以推广和修改;v可以把命令对象聚合在一起,合成为合成命令;v由于加进的具体命令类不影响其它的类,因此增加新的命令类很容易;缺点:可能会导致某些系统有过多的命令

14、类,几十、几百、甚至几千个,在这样的系统中命令模式的实现变得不现实;PDF 文件使用 pdfFactory Pro 试用版本创建 周甫()22命令模式的使用命令模式的使用事件授权处理、Swing组件的Undo和Redo;“玉帝让太白金星招悟空上天庭”、诸葛亮锦囊妙计杀魏延PDF 文件使用 pdfFactory Pro 试用版本创建 周甫()23命令模式的使用命令模式的使用玉帝让太白金星招悟空上天庭:PDF 文件使用 pdfFactory Pro 试用版本创建 周甫()24命令模式的使用命令模式的使用玉帝让太白金星招悟空上天庭:五个角色:、命令角色:圣旨;、具体命令角色:具体圣旨立即报道;、请求

15、者角色:太白金星;、接收者角色:美猴王;、客户角色:玉帝;PDF 文件使用 pdfFactory Pro 试用版本创建 周甫()25录音机的模拟系统录音机的模拟系统问题描述:小女孩朱丽(Julia)有一个录音机,要求用java语言实现这个录音机的模拟系统,这个系统有播音、倒带、停止功能。PDF 文件使用 pdfFactory Pro 试用版本创建 周甫()26录音机的模拟系统录音机的模拟系统五个角色:、朱丽是客户;、键盘是请求者;、录音、倒带、停止是命令;、录音机是接收者;、抽象命令?commandPDF 文件使用 pdfFactory Pro 试用版本创建 周甫()27录音机系统设计结构图录

16、音机系统设计结构图PDF 文件使用 pdfFactory Pro 试用版本创建 周甫()28录音机系统实现代码录音机系统实现代码public class Juliaprivate static Keypad keypad;private static AudioPlayer myAudio=new AudioPlayer();public static void main(String args)test1();PDF 文件使用 pdfFactory Pro 试用版本创建 周甫()29录音机系统实现代码录音机系统实现代码private static void test1()Command pl

17、ay=new PlayCommand(myAudio);Command stop=new StopCommand(myAudio);Command rewind=new RewindCommand(myAudio);keypad=new Keypad(play,stop,rewind);keypad.play();keypad.stop();keypad.rewind();keypad.stop();keypad.play();keypad.stop();PDF 文件使用 pdfFactory Pro 试用版本创建 周甫()30请求者角色源代码请求者角色源代码public class Keyp

18、adprivate Command playCmd;private Command rewindCmd;private Command stopCmd;public Keypad(Command aPlayCmd,Command aStopCmd,Command aRewindCmd)playCmd=aPlayCmd;stopCmd=aStopCmd;rewindCmd=aRewindCmd;PDF 文件使用 pdfFactory Pro 试用版本创建 周甫()31请求者角色源代码请求者角色源代码public void play()playCmd.execute();public void s

19、top()stopCmd.execute();public void rewind()rewindCmd.execute();PDF 文件使用 pdfFactory Pro 试用版本创建 周甫()32抽象命令角色源代码抽象命令角色源代码public interface Commandvoid execute();PDF 文件使用 pdfFactory Pro 试用版本创建 周甫()33播放命令源代码播放命令源代码public class PlayCommand implements Commandprivate AudioPlayer myAudio;public PlayCommand(Au

20、dioPlayer audio)myAudio=audio;public void execute()myAudio.play();PDF 文件使用 pdfFactory Pro 试用版本创建 周甫()34停止命令源代码停止命令源代码public class StopCommand implements Commandprivate AudioPlayer myAudio;public StopCommand(AudioPlayer audio)myAudio=audio;public void execute()myAudio.stop();PDF 文件使用 pdfFactory Pro 试

21、用版本创建 周甫()35倒带命令源代码倒带命令源代码public class RewindCommand implements Commandprivate AudioPlayer myAudio;public RewindCommand(AudioPlayer audio)myAudio=audio;public void execute()myAudio.rewind();PDF 文件使用 pdfFactory Pro 试用版本创建 周甫()36接收者角色源代码接收者角色源代码public class AudioPlayerpublic void play()System.out.prin

22、tln(Playing.);public void rewind()System.out.println(Rewinding.);public void stop()System.out.println(Stopped.);思考:将操作放在命令中,好不好?PDF 文件使用 pdfFactory Pro 试用版本创建 周甫()37录音机系统活动时序图录音机系统活动时序图PDF 文件使用 pdfFactory Pro 试用版本创建 周甫()38思考思考思考:将操作放在命令中,好不好?面向对象的基本原则:最自然的思维方式来描述客观世界。PDF 文件使用 pdfFactory Pro 试用版本创建 周

23、甫()39增加宏命令功能增加宏命令功能问题描述:在上述的录音机系统中增加一个记录功能:可以把一个一个的命令记录下来,在需要的时候,将这些命令一次性执行完,就是所谓的宏命令集功能;PDF 文件使用 pdfFactory Pro 试用版本创建 周甫()40增加宏命令功能增加宏命令功能分析:、增加一个操作键(请求者角色需改变);、朱丽应增加对该操作键的操作(客户要改变);、录音机(接收者角色)、抽象命令、具体命令都不需改变PDF 文件使用 pdfFactory Pro 试用版本创建 周甫()41朱丽增加一个新函数朱丽增加一个新函数public static void test2()Command p

24、lay=new PlayCommand(myAudio);Command stop=new StopCommand(myAudio);Command rewind=newRewindCommand(myAudio);MacroCommand macro=new MacroAudioCommand();macro.add(play);macro.add(stop);macro.add(rewind);macro.add(stop);macro.add(play);macro.add(stop);macro.execute();PDF 文件使用 pdfFactory Pro 试用版本创建 周甫()

25、42系统中增加一个宏命令接口系统中增加一个宏命令接口 public interface MacroCommand extends Command void execute();void remove(Command toRemove);void add(Command toAdd);PDF 文件使用 pdfFactory Pro 试用版本创建 周甫()43具体宏命令具体宏命令import java.util.Vector;public class MacroAudioCommand implements MacroCommandprivate Vector commandList=new Ve

26、ctor();public void add(Command toAdd)commandList.addElement(toAdd);public void remove(int index)commandList.remove(index);PDF 文件使用 pdfFactory Pro 试用版本创建 周甫()44具体宏命令具体宏命令public void remove(Command toRemove)commandList.removeElement(toRemove);public void execute()Command nextCommand=null;System.out.pr

27、intln(Automated playback of stored commmands.);for(int i=0;i commandList.size();i+)nextCommand=(Command)commandList.elementAt(i);nextCommand.execute();System.out.println(Finished automated playback of stored commmands.);PDF 文件使用 pdfFactory Pro 试用版本创建 周甫()45增加宏命令之分析增加宏命令之分析、宏命令接口的意义?能不能去掉?、请求者(键盘)是否应

28、增加一个传递操作?在上文中未加,那么如何加呢?、命令集合应该在哪个对象中保存?请求者还是宏命令自己?、如果将保存换到请求者的话,如何改动?讨论其合理性、扩展性、维护性。PDF 文件使用 pdfFactory Pro 试用版本创建 周甫()46股票交易系统的命令模式应用股票交易系统的命令模式应用问题描述:在股市上股民委托股票交易员买卖股票;五个角色:股民发命令;股票交易员传递命令;股票市场实现命令的操作;具体命令是买和卖;还需一个抽象命令。PDF 文件使用 pdfFactory Pro 试用版本创建 周甫()47股票交易系统的设计图PDF 文件使用 pdfFactory Pro 试用版本创建 周

29、甫()48客户端源代码public class Clientprivate Broker testInvoker;public static void main(String args)StockMarket stockMarket=new StockMarket();BuyStockCommand buy=new BuyStockCommand(stockMarket);SellStockCommand sell=new SellStockCommand(stockMarket);Broker myBroker=new Broker(buy,sell);myBroker.buy();/Buy

30、 SharesmyBroker.sell();/Sell SharesPDF 文件使用 pdfFactory Pro 试用版本创建 周甫()49股票交易员股票交易员public class Brokerprivate Command buyCommand;private Command sellCommand;public Broker(Command aBuyCommand,Command aSellCommand)buyCommand=aBuyCommand;sellCommand=aSellCommand;void buy()buyCommand.execute();void sell(

31、)sellCommand.execute();PDF 文件使用 pdfFactory Pro 试用版本创建 周甫()50抽象命令public interface Command/correction abstractionvoid execute();PDF 文件使用 pdfFactory Pro 试用版本创建 周甫()51具体命令(买股票)class BuyStockCommand implements Commandprivate StockMarket stock;public BuyStockCommand(StockMarket aStock)stock=aStock;public

32、void execute()stock.buy();PDF 文件使用 pdfFactory Pro 试用版本创建 周甫()52具体命令(卖股票)class SellStockCommand implements Commandprivate StockMarket stock;public SellStockCommand(StockMarket aStock)stock=aStock;public void execute()stock.sell();PDF 文件使用 pdfFactory Pro 试用版本创建 周甫()53接收者角色(股票市场)接收者角色(股票市场)public class

33、 StockMarketpublic void buy()System.out.println(You have baught in some stocks);public void sell()System.out.println(You have sold out some stocks);PDF 文件使用 pdfFactory Pro 试用版本创建 周甫()54买股票的时序图买股票的时序图PDF 文件使用 pdfFactory Pro 试用版本创建 周甫()55卖卖股票的时序图股票的时序图PDF 文件使用 pdfFactory Pro 试用版本创建 周甫()56The End谢谢!谢谢!PDF 文件使用 pdfFactory Pro 试用版本创建

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 应用文书 > 财经金融

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号© 2020-2023 www.taowenge.com 淘文阁