C#设计模式之十四命令模式(Command Pattern)【行为型】
一、引言 2.4、模式的组成 ?? ? ??? 从命令模式的结构图可以看出,它涉及到五个角色,它们分别是: ??? (1)、客户角色(Client):创建具体的命令对象,并且设置命令对象的接收者。注意这个不是我们常规意义上的客户端,而是在组装命令对象和接收者,或许,把这个Client称为装配者会更好理解,因为真正使用命令的客户端是从Invoker来触发执行。 ??? (2)、命令角色(Command):声明了一个给所有具体命令类实现的抽象接口。 ??? (3)、具体命令角色(ConcreteCommand):命令接口实现对象,是“虚”的实现;通常会持有接收者,并调用接收者的功能来完成命令要执行的操作。 ??? (4)、请求者角色(Invoker):要求命令对象执行请求,通常会持有命令对象,可以持有很多的命令对象。这个是客户端真正触发命令并要求命令执行相应操作的地方,也就是说相当于使用命令对象的入口。 ??? (5)、接受者角色(Receiver):接收者,真正执行命令的对象。任何类都可能成为一个接收者,只要它能够实现命令要求实现的相应功能。 2.5、命令模式的代码实现 ??? 下面以生活中吃饺子为例来说说如何实现命令模式吧。在现实生活中,作为北方人都爱吃饺子,我奶奶特别爱吃饺子,我也遗传了这个爱好。今天早上,我奶奶就发布了命令,说她老人家想吃猪肉大葱馅的饺子。我奶奶腿脚不好,就让我爸爸捎个话给我们夫妻俩,晚上要吃猪肉大葱馅的饺子。我瞬间就明白了,这个伟大的任务就落到我们夫妻俩肩上了。说做就做,保证晚饭能吃上热气腾腾的饺子,具体实现代码如下: 1 namespace 命令模式的实现 2 { 3 /// <summary> 4 /// 俗话说:“好吃不如饺子,舒服不如倒着”。今天奶奶发话要吃他大孙子和孙媳妇包的饺子。今天还拿吃饺子这件事来说说命令模式的实现吧。 5 </summary> 6 class Client 7 { 8 static void Main(string[] args) 9 { 10 //奶奶想吃猪肉大葱馅的饺子 11 PatrickLiuAndWife liuAndLai = new PatrickLiuAndWife();命令接受者 12 Command command = new MakeDumplingsCommand(liuAndLai);命令 13 PaPaInvoker papa = new PaPaInvoker(command); 命令请求者 14 15 奶奶发布命令 16 papa.ExecuteCommand(); 17 18 19 Console.Read(); 20 } 21 } 22 23 这个类型就是请求者角色--也就是我爸爸的角色,告诉奶奶要吃饺子 24 public sealed PaPaInvoker 25 26 我爸爸从奶奶那里接受到的命令 27 private Command _command; 28 29 爸爸开始接受具体的命令 30 public PaPaInvoker(Command command) 31 32 this._command = command; 33 34 35 爸爸给我们下达命令 36 void ExecuteCommand() 37 38 _command.MakeDumplings(); 39 40 41 42 该类型就是抽象命令角色--Commmand,定义了命令的抽象接口,任务是包饺子 43 abstract Command 44 45 真正任务的接受者 46 protected PatrickLiuAndWife _worker; 47 48 Command(PatrickLiuAndWife worker) 49 50 _worker = worker; 51 52 53 该方法就是抽象命令对象Command的Execute方法 54 MakeDumplings(); 55 56 57 该类型是具体命令角色--ConcreteCommand,这个命令完成制作“猪肉大葱馅”的饺子 58 MakeDumplingsCommand : Command 59 60 public MakeDumplingsCommand(PatrickLiuAndWife worker) : base(worker) { } 61 62 执行命令--包饺子 63 override MakeDumplings() 64 65 执行命令---包饺子 66 _worker.Execute("今天包的是农家猪肉和农家大葱馅的饺子"); 67 68 69 70 该类型是具体命令接受角色Receiver,具体包饺子的行为是我们夫妻俩来完成的 71 PatrickLiuAndWife 72 73 这个方法相当于Receiver类型的Action方法 74 void Execute( job) 75 76 Console.WriteLine(job); 77 78 79 }
????? 3.1】、命令模式的优点: ????????? (1)、命令模式使得新的命令很容易被加入到系统里。 ????????? (2)、可以设计一个命令队列来实现对请求的Undo和Redo操作。 ????? 3.2】、命令模式的缺点: ?????????? (1)、使用命令模式可能会导致系统有过多的具体命令类。这会使得命令模式在这样的系统里变得不实际。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |