1、命令模式簡介
1.1>、定義
命令模式的目的是解除命令發出者和接收者之間的緊密耦合關係,使二者相對獨立,有利於程式的並行開發和程式碼的維護。命令模式的核心思想是將請求封裝為一個物件,將其作為命令發起者和接收者的中介,而抽象出來的命令物件又使得能夠對一系列請求進行操作,如對請求進行排隊,記錄請求日誌以及支援可撤銷的操作等。
1.2>、使用頻率
中高
2、命令模式結構
2.1>、結構圖
2.2>、參與者
命令模式參與者:
◊ Command:命令抽象類,宣告一個執行操作的介面Execute,該抽象類並不實現這個介面,所有的具體命令都繼承自命令抽象類。
◊ ConcreteCommand
° 定義一個接收者物件與動作之間的請求繫結
° 呼叫Receiver的操作,實現Execute方法
◊ Invoker:命令的接收者,將命令請求傳遞給相應的命令物件,每個ConcreteCommand都是一個Invoker的成員
◊ Receiver:命令的接收者,知道如何實施與執行一個請求相關的操作
◊ Client:客戶端程式,建立一個具體命令物件並設定它的接收者
Command物件作為Invoker的一個屬性,當點選事件發生時,Invoker呼叫方法Invoke()將請求傳送給ConcreteCommand,再由ConcreteCommand呼叫Execute()將請求傳送給Receiver,Client負責建立所有的角色,並設定Command與Invoker和Receiver之間的繫結關係。
3、命令模式結構實現
Receiver.cs
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace DesignPatterns.CommandPattern.Structural { public class Receiver { public void Action() { Console.WriteLine("Called Receiver.Action()"); } } }
Command.cs
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace DesignPatterns.CommandPattern.Structural { public abstract class Command { protected Receiver receiver; public Command(Receiver receiver) { this.receiver = receiver; } public abstract void Execute(); } }
ConcreteCommand.cs
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace DesignPatterns.CommandPattern.Structural { public class ConcreteCommand : Command { public ConcreteCommand(Receiver receiver) : base(receiver) { } public override void Execute() { receiver.Action(); } } }
Invoker.cs
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace DesignPatterns.CommandPattern.Structural { public class Invoker { private Command _command; public void SetCommand(Command command) { this._command = command; } public void ExecuteCommand() { _command.Execute(); } } }
Program.cs
using System; using System.Collections.Generic; using System.Linq; using System.Text; using DesignPatterns.CommandPattern.Structural; namespace DesignPatterns.CommandPattern { class Program { static void Main(string[] args) { Receiver receiver = new Receiver(); Command command = new ConcreteCommand(receiver); Invoker invoker = new Invoker(); invoker.SetCommand(command); invoker.ExecuteCommand(); } } }
執行輸出:
Called Receiver.Action()
請按任意鍵繼續. . .
4、命令模式應用分析
命令模式適用情形:
1>、將使用者介面和行為分離,使兩者的開發可以並行不悖。
2>、在需要指定、排列和執行一系列請求的情況下,適用命令模式。
3>、支援修改日誌。
命令模式優點:
1>、命令模式將呼叫操作物件和知道如何實現該操作物件的解耦。
2>、在Command要增加新的處理操作物件很容易,可以通過建立新的繼承自Command的子類來實現。
3>、命令模式可以和Memento模式結合使用,支援取消的操作。
4>、支援日誌、請求佇列和複合命令。