Command模式屬于行為模式,作為大名鼎鼎的23個設計模式之一,Command模式理解起來不如工廠模式,單例模式等那么簡單直白,究其原因,行為模式著重于使用,如果沒有編程實踐,確實不如創造模式那么直白,我們先看看UML類圖,

估計很多同學看著圖就暈了,那么多東西,Command和Concrete Command還好理解,那些Receiver和Invoker又是什么東西呢?
別著急,只要理解了一點,這個模式就很容易理解了,下面劃重點,Command模式最主要的特點,是將命令封裝成類,在類中保存命令執行的背景關系(即該命令執行的引數,執行的物件),以實作命令執行物件和命令發出物件的解耦,
這樣一來是不是覺得好理解多了?Command類里面的Receiver,就是命令具體執行的物件,這里的Client可以理解為裝配環境,在這里面代碼實體化Command,Invoker內部保存命令(可以保存多條命令,實作命令記錄查看,撤銷等),客戶端代碼通過Invoker來操作命令,接下來我們看看示例代碼,
定義Command介面
首先我們定義一個支持撤銷的Command介面,
interface Command
{
void Execute();
void Undo();
}
定義Receiver
接下來我們定義Receiver,也就是命令的執行物件,這里我們定義一個Ball類,
class Ball
{
public int Size { get; set; } = 10;
public string Name { get; set; } = "My First Ball";
public void Inspect()
{
Console.WriteLine("My Name is {0} and size is {1}", Name, Size);
}
}
定義具體命令
這里定義兩個命令,一個修改名字,一個修改大小,
class ChangeNameCommand : Command
{
private Ball _Ball;
private string _OldName;
public string NameYouWant { get; set; }
public ChangeNameCommand(Ball ball)
{
_Ball = ball;
}
public void Execute()
{
_OldName = _Ball.Name;
_Ball.Name = NameYouWant;
}
public void Undo()
{
_Ball.Name = _OldName;
}
}
class ChangeSizeCommand : Command
{
//代碼大同小異,略
}
定義Invoker
接下來是Invoker,,也就是存盤命令,并最侄訓被用戶代碼呼叫的類,這里我們叫它CommandManager,
class CommandManager
{
private Stack<Command> commands = new Stack<Command>();
public void RunCommand(Command command)
{
command.Execute();
commands.Push(command);
}
public void Undo()
{
if (commands.Count > 0)
{
var command = commands.Pop();
command.Undo();
}
}
public void ShowCommands()
{
var temp = commands.Reverse();
foreach(var command in temp)
{
//display command
}
}
}
使用命令
現在我們看看客戶端代碼是怎么使用他們的,定義Ball,定義命令,通過CommandManager去呼叫,這樣可以方便查看命令記錄,撤銷命令,等,
static void Main(string[] args)
{
Ball ball = new Ball();
ball.Inspect();
ChangeNameCommand changeName = new ChangeNameCommand(ball) { NameYouWant = "Changed" };
ChangeSizeCommand changeSize = new ChangeSizeCommand(ball) { SizeYouWant = 20 };
CommandManager manager = new CommandManager();
manager.RunCommand(changeName);
manager.RunCommand(changeSize);
ball.Inspect();
manager.ShowCommands();
manager.Undo();
ball.Inspect();
manager.Undo();
ball.Inspect();
}
就醬,我們已經實作了命令模式,并且還支持命令的記錄與撤銷,希望能對大家有點幫助,
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/6002.html
標籤:設計模式
上一篇:代理模式
