解读设计模式----命令模式(Command Pattern)
***本文與作者原文有一定的偏差,其中加入了一部分是個(gè)人看法,詳細(xì)請(qǐng)查看作者原文。***
原文連接http://www.dofactory.com/Patterns/PatternCommand.aspx
命令模式意圖:
GOF 在《設(shè)計(jì)模式》一書中闡述其意圖:“將一個(gè)請(qǐng)求封裝為一個(gè)對(duì)象,從而使你可用不同的請(qǐng)求對(duì)客戶進(jìn)行參數(shù)化;對(duì)請(qǐng)求排隊(duì)或記錄請(qǐng)求日志,以及支持可取消的操作。”這里所謂的“不同的請(qǐng)求”也既意味著請(qǐng)求可能發(fā)生的變化,是一個(gè)可能擴(kuò)展的功能點(diǎn)。
命令模式UML圖:
Command模式將一個(gè)請(qǐng)求封裝為一個(gè)對(duì)象,從而使你可以使用不同的請(qǐng)求對(duì)客戶進(jìn)行參數(shù)化。
簡(jiǎn)單示例:
?1using?System;
?2using?System.Collections.Generic;
?3using?System.Text;
?4
?5namespace?DesignPattern.Command
?6{
?7????class?Program
?8????{
?9????????static?void?Main(string[]?args)
10????????{
11????????????//?創(chuàng)建receiver、command和invoker?
12????????????Receiver?receiver?=?new?Receiver();
13
14????????????//根據(jù)多態(tài),父類的引用指向子類對(duì)象
15????????????Command?command?=?new?ConcreteCommand(receiver);
16????????????Invoker?invoker?=?new?Invoker();
17
18????????????//設(shè)置和執(zhí)行命令
19????????????invoker.SetCommand(command);
20????????????invoker.ExecuteCommand();
21
22????????????Console.Read();
23????????}
24????}
25}
26
Command
?1using?System;
?2using?System.Collections.Generic;
?3using?System.Text;
?4
?5namespace?DesignPattern.Command
?6{
?7????public?abstract?class?Command
?8????{
?9????????protected?Receiver?receiver;
10
11????????/**////?<summary>
12????????///?構(gòu)造器注入
13????????///?</summary>
14????????///?<param?name="receiver"></param>
15????????public?Command(Receiver?receiver)
16????????{
17????????????this.receiver?=?receiver;
18????????}
19
20????????public?abstract?void?Execute();
21????}
22}
23
Invoker
?1using?System;
?2using?System.Collections.Generic;
?3using?System.Text;
?4
?5namespace?DesignPattern.Command
?6{
?7????public?class?Invoker
?8????{
?9????????private?Command?command;
10
11????????public?void?SetCommand(Command?command)
12????????{
13????????????this.command?=?command;
14????????}
15
16????????public?void?ExecuteCommand()
17????????{
18????????????command.Execute();
19????????}
20????}
21}
22
Receiver
?1using?System;
?2using?System.Collections.Generic;
?3using?System.Text;
?4
?5namespace?DesignPattern.Command
?6{
?7????public?class?Receiver
?8????{
?9????????public?void?Action()
10????????{
11????????????Console.WriteLine("Called?Receiver.Action()");
12????????}
13????}
14}
15
運(yùn)行結(jié)果:
Called Receiver.Action()
?
??? 在眾多的設(shè)計(jì)模式中,Command模式是很簡(jiǎn)單也很優(yōu)雅的一種設(shè)計(jì)模式。Command模式它封裝的是命令,把命令發(fā)出者的責(zé)任和命令執(zhí)行者的責(zé)任分開。[TerryLee]
注意:
??? 如果比較類圖結(jié)構(gòu),我門會(huì)發(fā)現(xiàn)Command模式、Strategy模式、State模式是完全一樣的。事實(shí)正是如此,由于他門的設(shè)計(jì)思想都是對(duì)易于變化的部分進(jìn)行抽象、或?yàn)榻涌凇Nㄒ坏膮^(qū)別,就是所抽象的行為職責(zé)不同而已,這一點(diǎn)從各自的名字就可以看出。
參考資料:
TerryLee------.NET設(shè)計(jì)模式系列
Bruce Zhang---《軟件設(shè)計(jì)精要與模式》
www.dofactory.com
本文示例源碼下載
???
轉(zhuǎn)載于:https://www.cnblogs.com/beniao/archive/2008/04/09/1145867.html
總結(jié)
以上是生活随笔為你收集整理的解读设计模式----命令模式(Command Pattern)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 需求分析说明书和需求规格说明书
- 下一篇: WPF随笔(一)