首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

C# 設計模式:命令模式命令介面與具體命令實作 (3/5)

     編輯:關於C語言

命令介面:ICommand

定義命令執行與撤銷的標準契約:

using System;
using System.Collections.Generic;
using System.Text;

namespace Pattern.Command
{
    /// 
    /// 命令(Command)角色
    /// 
    public interface ICommand
    {
        /// 
        /// 執行
        /// 
        /// 操作的方法及操作的信息
        string Execute();

        /// 
        /// 取消執行
        /// 
        /// 操作的方法及操作的信息
        string UnExecute();
    }
}

具體命令:SqlMessageCommand

封裝接收者、動作與參數,實作執行與反向操作:

using System;
using System.Collections.Generic;
using System.Text;

namespace Pattern.Command
{
    /// 
    /// 具體命令(ConcreteCommand)角色
    /// 
    public class SqlMessageCommand : ICommand
    {
        /// 
        /// 操作的方法
        /// 
        private Action _action;

        /// 
        /// Message 實體物件
        /// 
        private MessageModel _mm;

        /// 
        /// 建構函式
        /// 
        /// 操作的方法
        /// Message 實體物件
        public SqlMessageCommand(Action action, MessageModel mm)
        {
            this._action = action;
            this._mm = mm;
        }

        /// 
        /// 執行
        /// 
        /// 操作的方法及操作的信息
        public string Execute()
        {
            new SqlMessage().Operation(_action, _mm);
            return _action.ToString() + ":" + _mm.Message;
        }

        /// 
        /// 取消執行(調用一個方法,以決定取消執行的演算法)
        /// 
        /// 操作的方法及操作的信息
        public string UnExecute()
        {
            _action = GetUndoAction(_action);
            new SqlMessage().Operation(_action, _mm);
            return _action.ToString() + ":" + _mm.Message;
        }

        /// 
        /// 獲得取消執行的演算法
        /// 
        /// 操作的方法
        /// 反向 Action
        private Action GetUndoAction(Action action)
        {
            Action undo;

            switch (action)
            {
                case Action.Insert:
                    undo = Action.Delete;
                    break;
                case Action.Delete:
                    undo = Action.Insert;
                    break;
                default:
                    undo = Action.Insert;
                    break;
            }

            return undo;
        }
    }
}

ConcreteCommand 核心設計

  • 狀態封裝:建構函式接收 Action(操作類型)與 MessageModel(參數),封裝執行所需完整資訊。
  • 接收者解耦:Execute() 內部建立 SqlMessage 並呼叫 Operation(),Invoker 無需知曉 Receiver。
  • 反向操作:UnExecute() 透過 GetUndoAction() 將 Insert↔Delete 互換,再執行。
  • 可序列化:命令物件可序列化儲存,支援持久化撤銷歷史(如編輯器)。

命令模式經典應用

  • GUI 菜單/工具列按鈕(每個動作一個命令)
  • 文字編輯器撤銷/重做
  • 資料庫交易管理(Commit/Rollback)
  • 巨集錄製與回放
  • 工作佇列/排程系統
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved