《行为型模式(命令模式).ppt》由会员分享,可在线阅读,更多相关《行为型模式(命令模式).ppt(56页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、1命令模式命令模式(Command)2命令模式命令模式意图意图意意图图:将将一一个个请请求求封封装装为为一一个个对对象象,从从而而使使你你可可用用不不同同的的请请求求对对客客户户进进行行参参数数化化;对对请请求求排排队队或或记记录录请请求求日日志志,以以及及支持可撤消的操作。支持可撤消的操作。3命令模式命令模式结构结构4命令模式命令模式参与者参与者命命令令(Command)角角色色:声声明明了了一一个个给给所所有有具具体体命令类的抽象接口。命令类的抽象接口。具具体体命命令令(ConcreteCommand)角角色色:定定义义一一个个接接收收者者和和行行为为之之间间的的弱弱耦耦合合;实实现现ex
2、ecute()方方法法,负负责责调调用用接接收收者者的的相相应应操操作作。execute()方法通常叫做执行方法。方法。方法通常叫做执行方法。方法。5命令模式命令模式参与者参与者请请求求者者(Invoker)角角色色:负负责责调调用用命命令令对对象象执执行请求,相关的方法叫做行动方法。行请求,相关的方法叫做行动方法。接接收收者者(Receiver)角角色色:负负责责具具体体实实施施和和执执行行一一个个请请求求。任任何何一一个个类类都都可可以以成成为为接接收收者者,实施和执行请求的方法叫做行动方法。实施和执行请求的方法叫做行动方法。客客户户端端(Client)角角色色:创创建建一一个个具具体体命
3、命令令(ConcreteCommand)对象并确定其接收者。对象并确定其接收者。6生活中的例子生活中的例子Command模模式式将将一一个个请请求求封封装装为为一一个个对对象象,从从而而使使你你可可以以使使用用不不同同的的请请求求对对客客户户进进行行参参数数化化。用用餐餐时时的的账账单单是是Command模模式式的的一一个个例例子子。服服务务员员接接受受顾顾客客的的点点单单,把把它它记记在在账账单单上上封封装装。这这个个点点单单被被排排队队等等待待烹烹饪饪。注注意意这这里里的的账账单单是是不不依依赖赖于于菜菜单单的的,它它可可以以被被不不同同的的顾顾客客使使用用,因此它可以添入不同的点单项目。
4、因此它可以添入不同的点单项目。7生活中的例子生活中的例子8家电自动化遥控器家电自动化遥控器9如何设计这个遥控器如何设计这个遥控器API许许多多类类都都具具备备on()和和off()方方法法,还还有有一一些些dim(),setTemperature(),setVolumn(),setDirection()。还有更多厂商类,每个类还会有各式各样的方法还有更多厂商类,每个类还会有各式各样的方法遥遥控控器器应应该该知知道道如如何何解解读读按按钮钮被被按按下下的的动动作作,然然后后发发出出正正确确的的请请求求,但但是是不不需需要要知知道道这这些些家家电电自自动化的细节,比如如何打开热水器。动化的细节,比
5、如如何打开热水器。10如何设计这个遥控器如何设计这个遥控器API命命令令模模式式可可以以将将“动动作作的的请请求求者者”从从“动动作作的的执执行行者者”对对象象中中解解耦耦,在在这这个个例例子子中中请请求求者者是是遥遥控控器器,执执行行者者则则是是厂厂商商类中的相应对象,如热水器等。类中的相应对象,如热水器等。1112对象村餐厅的角色和职责对象村餐厅的角色和职责在在餐餐厅厅交交互互模模型型中中,女女招招待待员员实实现现了了将将“发发出出请请求求的的对对象象”和和“接接受受与与执执行行这这些请求的对象些请求的对象”分隔开来。分隔开来。对对于于遥遥控控器器API,我我们们需需要要分分隔隔开开“发发
6、出出请请求求的的按按钮钮代代码码”和和“执执行行请请求求的的厂厂商商特特定定对对象象”,实现两者的松散耦合。,实现两者的松散耦合。13从餐厅到命令模式从餐厅到命令模式14第一个命令对象第一个命令对象15实现一个打开电灯的命令实现一个打开电灯的命令16使用命令对象使用命令对象17遥控器使用的简单测试遥控器使用的简单测试18定义命令模式定义命令模式命命令令模模式式:将将“请请求求”封封装装成成对对象象,以以便便使使用用不不同同的的请请求求、队队列列或或者者日日志志来来参参数数化化其其他他对对象象。命命令令模模式式也也支支持持可可撤撤销的操作。销的操作。命命令令对对象象将将动动作作和和接接收收者者包
7、包进进对对象象中中,这这个个对象只须具备对象只须具备execute()方法即可。方法即可。19定义命令模式定义命令模式2021将命令指定到插槽将命令指定到插槽22实现遥控器实现遥控器23实现遥控器实现遥控器24实现命令实现命令25实现命令实现命令26逐步测试遥控器逐步测试遥控器27逐步测试遥控器逐步测试遥控器28逐步测试遥控器逐步测试遥控器29逐步测试遥控器逐步测试遥控器3031大功告成大功告成撤销功能撤销功能一键全开一键全开32撤销功能撤销功能撤销功能:将上一动作逆转,如上一动作为开撤销功能:将上一动作逆转,如上一动作为开灯,则撤销功能则为关灯。灯,则撤销功能则为关灯。33撤销功能撤销功能3
8、4撤销功能撤销功能35撤销功能撤销功能36撤销功能撤销功能37驱动程序驱动程序38驱动程序驱动程序39使用状态实现撤销使用状态实现撤销40使用状态实现撤销使用状态实现撤销41使用状态实现撤销使用状态实现撤销42加入撤销到吊扇的命令类加入撤销到吊扇的命令类43准备测试天花板吊扇准备测试天花板吊扇44准备测试天花板吊扇准备测试天花板吊扇45测试天花板吊扇测试天花板吊扇46Party模式模式47Party模式模式48Party模式模式实现步骤实现步骤49Party模式模式实现步骤实现步骤50Party模式模式实现步骤实现步骤51命令模式的更多用途命令模式的更多用途队队列列请请求求:可可以以将将运运算
9、算块块打打包包,然然后后将将它它传传来来传去,就像是一个对象一样。传去,就像是一个对象一样。日日志志请请求求:利利用用命命令令模模式式,将将历历史史记记录录储储存存在在磁磁盘盘中中。一一旦旦系系统统死死机机,我我们们就就可可以以将将命命令令对对象象重重新新加加载载,并并成成批批地地依依次次调调用用这这些些对对象象的的execute()方法。方法。52命令模式的效果及实现要点命令模式的效果及实现要点1.Command模模式式的的根根本本目目的的在在于于将将“行行为为请请求求者者”与与“行行为为实实现现者者”解解耦耦,在在面面向向对对象象语语言言中中,常见的实现手段是常见的实现手段是“将行为抽象为
10、对象将行为抽象为对象”。2.实实 现现 Command接接 口口 的的 具具 体体 命命 令令 对对 象象ConcreteCommand有有时时候候根根据据需需要要可可能能会会保保存一些额外的状态信息。存一些额外的状态信息。3.通通过过使使用用Compmosite模模式式,可可以以将将多多个个命命令令封装为一个封装为一个“复合命令复合命令”MacroCommand。53命令模式的效果及实现要点命令模式的效果及实现要点4.Command模模式式与与C#中中的的Delegate有有些些类类似似。但但 两两 者者 定定 义义 行行 为为 接接 口口 的的 规规 范范 有有 所所 区区 别别:Comm
11、and以以面面向向对对象象中中的的“接接口口-实实现现”来来定定义义行行为为接接口口规规范范,更更严严格格,更更符符合合抽抽象象原原则则;Delegate以以函函数数签签名名来来定定义义行行为为接接口口规规范范,更灵活,但抽象能力比较弱。更灵活,但抽象能力比较弱。5.使使用用命命令令模模式式会会导导致致某某些些系系统统有有过过多多的的具具体体命命令令类类。某某些些系系统统可可能能需需要要几几十十个个,几几百百个个甚甚至至几几千千个个具具体体命命令令类类,这这会会使使命命令令模模式式在在这这样样的的系统里变得不实际。系统里变得不实际。54命令模式的适用性命令模式的适用性在下面的情况下应当考虑使用
12、命令模式:在下面的情况下应当考虑使用命令模式:1使使用用命命令令模模式式作作为为CallBack在在面面向向对对象象系系统统中中的的替替代代。CallBack讲讲的的便便是是先先将将一一个个函函数登记上,然后在以后调用此函数。数登记上,然后在以后调用此函数。2需需要要在在不不同同的的时时间间指指定定请请求求、将将请请求求排排队队。一一个个命命令令对对象象和和原原先先的的请请求求发发出出者者可可以以有有不不同同的的生生命命期期。换换言言之之,原原先先的的请请求求发发出出者者可可能能已已经经不不在在了了,而而命命令令对对象象本本身身仍仍然然是是活活动动的的。这这时时命命令令的的接接收收者者可可以以
13、是是在在本本地地,也也可可以以在在网网络络的的另另外外一一个个地地址址。命命令令对对象象可可以以在在串串形形化化之之后后传传送送到到另另外外一一台机器上去。台机器上去。55命令模式的适用性命令模式的适用性在下面的情况下应当考虑使用命令模式:在下面的情况下应当考虑使用命令模式:3系系统统需需要要支支持持命命令令的的撤撤消消(undo)。命命令令对对象象可可以以把把状状态态存存储储起起来来,等等到到客客户户端端需需要要撤撤销销命命令令所所产产生生的的效效果果时时,可可以以调调用用undo()方方法法,把把命命令令所所产产生生的的效效果果撤撤销销掉掉。命命令令对对象象还还可可以以提提供供redo()方法,以供重新实施命令效果。方法,以供重新实施命令效果。4如如果果一一个个系系统统要要将将系系统统中中所所有有的的数数据据更更新新到到日日志志里里,以以便便在在系系统统崩崩溃溃时时,可可以以根根据据日日志志里里读读回回所所有有的的数数据据更更新新命命令令,重重新新调调用用Execute()方方法法一一条条一一条条执执行行这这些些命命令令,从从而而恢恢复复系系统统在在崩崩溃溃前前所做的数据更新。所做的数据更新。56
限制150内