1. 程式人生 > >【Unity3d學習筆記】命令模式及其應用

【Unity3d學習筆記】命令模式及其應用

開始
  
  

定義

命令模式:將一個請求封裝為一個物件,從而使你可用不同的請求對客戶進行引數化; 對請求排隊或記錄請求日誌,以及支援可撤銷的操作。
命令模式是一種回撥的面向物件實現

UML

這裡寫圖片描述

圖片源自《大話設計模式》

實現

//用來宣告執行操作的介面
abstract class Command
{
    protected Receiver receiver;
    public Command(Receiver receiver)
    {
        this.receiver = receiver;
    }

    abstract
public void Execute(); } //將一個接受者物件綁定於一個動作,呼叫接受者相應的操作,以實現Excute class ConcreteCommand:Command { public ConcreteCommand(Receiver receiver):base(receiver) { } public override void Execute() { receiver.Action(); } } //要求該命令執行這個請求 class Invoker { private Command command; public
void SetCommand(Command command) { this.command = command; } public void ExecuteCommand() { command.Execute(); } } //知道如何實施與執行一個與請求相關的操作,任何類都可能成為一個接受者 class Receiver { public void Action() { Console.WriteLine("請求執行!"); } } //客戶端程式碼,建立一個具體命令物件並設定它的接受者
static void Main(string[] args) { Receiver r = new Receiver(); Command c = new Command(); Invoker i = new Invoker(); i.SetCommand(c); i.ExecuteCommand(); Console.Read(); }

優點

  • 能較容易的設計一個命令佇列
  • 在需要的情況下,可以容易的將命令記入日誌
  • 允許接受請求的一方決定是否要否決請求
  • 可以容易地實現對請求的撤銷和重做
  • 由於新增新的具體命令類(ConcreteCommand)不影響其他的類,因此增加新的具體命令類很容易
  • 命令模式把請求一個操作的物件與知道怎麼執行一個操作的物件分隔開

  
應用
  
  

配置輸入

一般的輸入命令:

void Update () {
            if (Input.GetKeyDown(KeyCode.W)) Jump();
            if (Input.GetKeyDown(KeyCode.S)) GetDown();
            if (Input.GetKeyDown(KeyCode.A)) Defense();
            if (Input.GetKeyDown(KeyCode.D)) Attack();

    }

為了支援可以配置按鍵功能,需要將這些對Jump()和Attack()的直接呼叫轉化為可以變換的東西。

撤銷和重做