19命令模式解说.ppt

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
本章目标 理解命令模式 命令模式在.net中的应用 命令模式 在众多的设计模式中,Command模式是很简单也很优雅的一种设计模式。Command模式它封装的是命令,把命令发出者的责任和命令执行者的责任分开。 比如一个地摊烤肉操作系统 烤肉系统实现 烤肉者类实现代码如下: 烤肉系统代码调用 调用代码如下 如果我要3串烤羊肉,1一个鸡翅 10串烤羊肉 烤羊肉和鸡翅各20 10个鸡翅 …… …… 升级为烤肉店 客户直接喊烤肉者,他会忙不过来—出错 增加服务员角色,避免乱套 服务员只需要知道将客户的命令传递给烤肉者即可 烤肉系统V2 抽象命令类 烤肉系统V2 具体命令类 烤肉系统V2 服务员类 烤肉系统V2 客户调用 存在的问题 用户并不是只点一个菜 材料没了,服务员不知道 客户可能需要取消订单 …… 烤肉系统V3 服务员类 烤肉系统V3 服务员类 烤肉系统V3 客户端调用 命令模式 意图 将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可撤消的操作。[GOF 《设计模式》] 命令模式代码分析 .NET中的Command模式 在ASP.NET的MVC模式中,有一种叫Front Controller的模式,它分为Handler和Command树两个部分,Handler处理所有公共的逻辑,接收HTTP Post或Get请求以及相关的参数并根据输入的参数选择正确的命令对象,然后将控制权传递到Command对象,由其完成后面的操作,这里面其实就是用到了Command模式。 效果及实现要点 1.Command模式的根本目的在于将“行为请求者”与“行为实现者”解耦,在面向对象语言中,常见的实现手段是“将行为抽象为对象”。 2.实现Command接口的具体命令对象ConcreteCommand有时候根据需要可能会保存一些额外的状态信息。 3.通过使用Compmosite模式,可以将多个命令封装为一个“复合命令”MacroCommand。 4.Command模式与C#中的Delegate有些类似。但两者定义行为接口的规范有所区别:Command以面向对象中的“接口-实现”来定义行为接口规范,更严格,更符合抽象原则;Delegate以函数签名来定义行为接口规范,更灵活,但抽象能力比较弱。 5.使用命令模式会导致某些系统有过多的具体命令类。某些系统可能需要几十个,几百个甚至几千个具体命令类,这会使命令模式在这样的系统里变得不实际。 适用性 在下面的情况下应当考虑使用命令模式: 1.使用命令模式作为CallBack在面向对象系统中的替代。CallBack讲的便是先将一个函数登记上,然后在以后调用此函数。 2.需要在不同的时间指定请求、将请求排队。一个命令对象和原先的请求发出者可以有不同的生命期。换言之,原先的请求发出者可能已经不在了,而命令对象本身仍然是活动的。这时命令的接收者可以是在本地,也可以在网络的另外一个地址。命令对象可以在串形化之后传送到另外一台机器上去。 3.系统需要支持命令的撤消(undo)。命令对象可以把状态存储起来,等到客户端需要撤销命令所产生的效果时,可以调用undo()方法,把命令所产生的效果撤销掉。命令对象还可以提供redo()方法,以供客户端在需要时,再重新实施命令效果。 4.如果一个系统要将系统中所有的数据更新到日志里,以便在系统崩溃时,可以根据日志里读回所有的数据更新命令,重新调用Execute()方法一条一条执行这些命令,从而恢复系统在崩溃前所做的数据更新。 本课程版权归北风网所有 欢迎访问我们的官方网站 * 北风网项目培训 讲师:石曼迪 设计模式——命令模式 public class Barbecuer { //烤羊肉 public void BakeMutton() { Console.WriteLine(烤羊肉串!); } //烤鸡翅 public void BakeChickenWing() { Console.WriteLine(烤鸡翅!); } } 烤羊肉 烤鸡翅 Barbecuer boy = new Barbecuer(); boy.BakeMutton(); boy.BakeMutton(); boy.BakeMutton(); boy.BakeChickenWing(); boy.BakeMutton(); boy.BakeMutton(); boy.BakeChickenWing(); 这

文档评论(0)

w5544434 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档