设为首页 加入收藏

TOP

通俗易懂设计模式解析——命令模式(一)
2019-09-30 16:45:14 】 浏览:121
Tags:通俗 易懂 设计模式 解析 命令 模式

前言

  今天我们一起来看行为型设计模式中的命令模式、何为命令模式呢?先谈命令——我现在需要对某一条信息进行删除,我进行点击删除按钮。后台执行删除的命令、对信息进行删除。那么我们要讲的命令模式又是什么呢?命令模式就是把一个操作或者行为抽象为一个对象。然后通过对命令的抽象化来使得发出命令的职责和执行命令的职责分隔开。简单来说命令模式就是解决命令的请求者和命令的执行者之间的耦合关系的。

命令模式介绍

一、来由

  在我们开发软件系统的时候,命令的请求者和命令的执行者是属于紧耦合的状态。但是对于某些特殊场合这么一种紧耦合的状态就不合适了。例如对行为命令的”日志记录、撤销/恢复、命令的队列”等操作就不太合适了。那么在这些情况下如何对这些命令进行统一的管理呢?实现其松耦合呢?

二、意图

  将一个请求封装成一个对象,从而使您可以用不同的请求对客户进行参数化。

三、案例图

 

四、命令模式代码示例

我们看上面的案例图可以看到命令模式是包含了以下五个部分的:

客户角色:创建具体的命令对象并确定命令对象的接收者

命令请求者:命令模式中最重要的角色、持有命令对象、实现对命令的控制、要求命令对象执行请求

命令接收者:真正的命令的执行者、实现具体功能

命令角色:声明所有的命令的一个抽象类

具体命令角色:命令接口实现对象、持有命令接收者、调用接收者完成命令的执行

在我们日常软件开发过程中必定会涉及到信息的增删改查、一般的信息进行操作也就罢了。但是对于一些重要的信息进行操作的时候我们是否就需要对其进行控制了。比如对其操作的日志的记录。对操作命令的撤销恢复。这里我们看看如何使用命令模式来对命令进行控制操作:

 

namespace Command_Pattern
{
    class CommandPattern
    {
    }
    #region 命令接收者——具体操作 ===================
    /// <summary>
    /// 执行命令
    /// </summary>
    public class InfoReceiver
    {
        public void Delete()
        {
            Console.WriteLine("删除了第一条信息!");
        }
        public void Update()
        {
            Console.WriteLine("更新了第二天信息!");
        }
    }
    #endregion

    #region 命令请求者——控制命令 ===================
    /// <summary>
    /// 控制命令调用请求
    /// </summary>
    public class InfoInvoke
    {
        /// <summary>
        /// 记录上一个命令
        /// </summary>
        private Command lastCommand =null;
        /// <summary>
        /// 接收当前命令
        /// </summary>
        private Command _command = null;
        public InfoInvoke(Command command=null) 
        {
            this._command = command;
        }
        public string ExecuteInvoke()
        {
            if (_command==null&& lastCommand==null) 
                return ("无命令执行!");
            if (_command == null)
            {
                Console.WriteLine($"记录此操作记录{_command.GetType().Name}的撤销操作!");
                _command = lastCommand;
                return ("执行撤销操作!");
            }
            Console.WriteLine($"记录此操作记录{_command.GetType().Name}!");
            _command.Execute();
            return ("执行成功!");
        }
    }
    #endregion

    #region 命令角色——抽象命令 =====================
    /// <summary>
    /// 抽象命令 持有命令接收者,调用接收者执行命令
    /// </summary>
    public abstract class Command
    {
        protected InfoReceiver _infoReceiver;
        public Command(InfoReceiver infoReceiver)
        {
            this._infoReceiver = infoReceiver;
        }
        public abstract void Execute();
    }
    #endregion

    #region 具体命令角色——调用接收者 ===============
    /// <summary>
    /// 实现抽象角色
    /// </summary>
    public class InfoCommandDelete : Command
    { 
        public InfoCommandDelete(InfoReceiver infoReceiver) : base(infoReceiver) { }
        public override void Execute()
        {
            _infoReceiver.Delete();
        }
    }
    #endregion

    #region 具体命令角色——调用接收者 ===============
    /// <summary>
    /// 实现抽象角色
    /// </summary>
    public class InfoCommandUpdate : Command
    {
        public InfoCommandUpdate(InfoReceiver infoReceiver) : base(infoReceiver) { }
        public override void Execute()
        {
            _infoReceiver.Update();
        }
    }
    #endregion
}

 

namespace Command_Pattern
{
    class Program
    {
        static void Main(string[] args)
        {
            ///初始化命令接收者和命令请求者还有具体命令
            InfoReceiver infoReceiver = new InfoReceiver();

            InfoCommandDelete infoCommandDelete = new InfoCommandDelete(infoReceiver);

            InfoInvoke infoInvoke = new InfoInvoke(infoCommandDelete);
            var result=infoInvoke.ExecuteInvoke();

            Console.WriteLine
首页 上一页 1 2 下一页 尾页 1/2/2
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇设计模式 - 七大设计原则(四)- .. 下一篇记一个复杂组件(Filter)的从设..

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目