1. 程式人生 > >設計模式總結 (五)

設計模式總結 (五)

param href com 參數化 耦合度 實現 需要 進行 導致

命令模式:
  將一個請求封裝為一個對象,從而使你可用不同的請求對客戶進行參數化;對請求排隊或記錄請求日誌,以及支持可取消的操作。
例:http://www.cnblogs.com/wangjq/archive/2012/07/11/2585930.html

/// <summary>
    /// 接收者類,知道如何實施與執行一個請求相關的操作,任何類都可能作為一個接收者。
    /// </summary>
    public class Receiver
    {
        /// <summary>
        /// 真正的命令實現
        /// </summary>
        public
void Action() { Console.WriteLine("Execute request!"); } } /// <summary> /// 抽象命令類,用來聲明執行操作的接口 /// </summary> public interface ICommand { void Execute(); } /// <summary> /// 具體命令類,實現具體命令。 /// </summary> public class
ConcereteCommand : ICommand { // 具體命令類包含有一個接收者,將這個接收者對象綁定於一個動作 private Receiver receiver; public ConcereteCommand(Receiver receiver) { this.receiver = receiver; } /// <summary> /// 說這個實現是“虛”的,因為它是通過調用接收者相應的操作來實現Execute的
/// </summary> public void Execute() { receiver.Action(); } } /// <summary> /// 調度類,要求該命令執行這個請求 /// </summary> public class Invoker { private ICommand command; /// <summary> /// 設置命令 /// </summary> /// <param name="command"></param> public void SetCommand(ICommand command) { this.command = command; } /// <summary> /// 執行命令 /// </summary> public void ExecuteCommand() { command.Execute(); } }
class Program
    {
        static void Main(string[] args)
        {
            Receiver receiver = new Receiver();
            ICommand command = new ConcereteCommand(receiver);
            Invoker invoker = new Invoker();

            invoker.SetCommand(command);
            invoker.ExecuteCommand();

            Console.Read();
        }
    }

優點

  1 解除了請求者與實現者之間的耦合,降低了系統的耦合度。

  2 對請求排隊或記錄請求日誌,支持撤銷操作。

  3 可以容易地設計一個組合命令。

  4 新命令可以容易地加入到系統中。

缺點

  1 因為針對每一個命令都需要設計一個具體命令類,使用命令模式可能會導致系統有過多的具體命令類。

設計模式總結 (五)