1. 程式人生 > >C# 設計模式-命令(Command)

C# 設計模式-命令(Command)

將一個請求封裝為一個物件,達到用不同請求對客戶進行引數化。呼叫者通過某個命令來呼叫接收者執行相關操作,減弱呼叫者與接收者的耦合度。

主要組成:

Command-命令父類或介面

ConcreteCommand-具體命令

Invoker-呼叫者

Receiver-接收者,執行命令指定的相關操作

相關類:

using System;

namespace Command
{
    /// <summary>
    /// 命令父類(或介面)
    /// </summary>
    abstract class CommandClass
    {
        public abstract void Execute();
    }

    /// <summary>
    /// 開啟檔案(具體命令)
    /// </summary>
    class OpenFileCommand : CommandClass
    {
        FileReceiver fileReceiver;

        public OpenFileCommand(FileReceiver fileReceiver)
        {
            this.fileReceiver = fileReceiver;
        }
        public override void Execute()
        {
            fileReceiver.OpenFile();
        }
    }
    /// <summary>
    /// 複製檔案(具體命令)
    /// </summary>
    class CopyFileCommand : CommandClass
    {
        FileReceiver fileReceiver;

        public CopyFileCommand(FileReceiver fileReceiver)
        {
            this.fileReceiver = fileReceiver;
        }
        public override void Execute()
        {
            fileReceiver.CopyFile();
        }
    }

    /// <summary>
    /// 檔案(接收者,執行相關操作)
    /// </summary>
    class FileReceiver
    {
        public void OpenFile()
        {
            Console.WriteLine("開啟檔案");
        }

        public void CopyFile()
        {
            Console.WriteLine("複製檔案");
        }
    }

    /// <summary>
    /// 呼叫者(可忽略呼叫者,直接呼叫Execute()命令)
    /// </summary>
    class Invoker
    {
        //呼叫命令
        public void Invoke(CommandClass command)
        {
            command.Execute();
        }
    }
}

呼叫:
using System;

namespace Command
{
    class Program
    {
        static void Main(string[] args)
        {
            //呼叫者
            Invoker invoker = new Invoker();
            //接收者
            FileReceiver fileReceiver = new FileReceiver();
            //具體命令
            OpenFileCommand openFileCommand = new OpenFileCommand(fileReceiver);
            //呼叫命令
            invoker.Invoke(openFileCommand);

            CopyFileCommand copyFileCommand = new CopyFileCommand(fileReceiver);
            invoker.Invoke(copyFileCommand);

            Console.Read();
        }
    }
}

結果:

參考資料:《設計模式-可複用面對物件軟體的基礎》