• 39、C#设计模式之命令模式(Command)


    命令模式是行为形模式

    耦合与变化

      耦合是软件不能抵御变化灾难的根本性原因。不仅实体对象与实体对象之间存在耦合关系,实体对象与行为操作之间也存在耦合关系。

      

    动机(Motivation) 

      在软件构建过程中,“行为请求者”与“行为实现者”通常呈现一种“紧耦合”。但在某些场合--比如需要对行为进行“记录、撤销/重做(undo/redo)、事务”等处理,这种无法抵御变化的紧耦合是不合适的。  

      在这种情况下,如何将“行为请求者”与“行为实现者解耦?将一组行为抽象为对象,可以实现二者之间的松耦合。

    意图(Intent)

      将一个请求封装为一个对象,从而使你可用不同的请求对客户(行为的请求者)进行参数化;对请求排队或记录请求日志,以及支持可撤销的操作。--《设计模式》GoF

    结构(Structure)

    using System.Collections.Generic;
    
    namespace 命令模式
    {
        //实现Command设计模式--抽象体
       public interface Command2
        {
            void  Show();
            void UnDo();
            void ReDo();
        }
        //程序主干/高层抽象
        public class Application2
        {
            public bool canUnDo;
            public bool canReDo;
            public Stack<Command> stack;
            public Stack<Command> unDoList;
            public void Show()
            {
                foreach (Command c in stack)
                {
                    c.Show();
                }
            }
            public void Undo()
            {
                if (canUnDo)
                {
                    Command command = stack.Pop();
                    command.UnDo();
                    unDoList.Push(command);
                }
            }
            public void ReDo()
            {
                if (canReDo)
                {
                    Command command = stack.Pop();
                    command.ReDo();
                }
            }
        }
    
        //具体化的命令对象--从抽象意义来讲,DocumentCommand表示一个行为
        //ConcreteCommand
        public class DocumentCommand : Command2
        {
            Document2 document;
            public DocumentCommand(Document2 document)
            {
                this.document = document;
            }
            public  void Show()
            {
                document.ShowText();
            }
            public void UnDo(){ }
            public void ReDo() { }
        }
        //ConcreteCommand
        public class GraphicsCommand : Command2
        {
            Graphics2 graphics;
            public GraphicsCommand (Graphics2 graphics)
            {
                this.graphics = graphics;
            }
    
            public void Show() { }
            public void UnDo() { }
            public void ReDo() { }
    
        }
       //已经存在的实现细节,底层实现(Receiver)
        public class Graphics2
        {
            public void ShowText() { }
    
            public void UnDo() { }
    
            public void ReDo() { }
        }
        //已经存在的实现细节,底层实现(Receiver)
        public class Document2
        {
            public void ShowText() { }
    
            public void UnDo() { }
    
            public void ReDo() { }
        }
    }

    Command模式的几个要点:

      Command模式的根本目的在于将”行为请求者“与”行为实现者“解耦,在面向对象语言中,常见的实现手段是”将行为抽象为对象“。

      实现Command接口的具体命令对象ConcreteCommand有时候根据需要可能会保存一些额外的状态信息。

      通过使用Composite(组合)模式,可以将多个”命令“封装为一个”复合命令“MacroCommand。

      Command模式与C#中的Delegate有些类似。但两者定义行为接口的规范有所区别:Command以面向对象中的”接口-实现“来定义行为接口规范,更严格,更符合抽象原则;Delegate以函数签名来定义行为接口规范,更灵活但抽象能力比较弱。

    • 添加到短语集
       
      • 没有此单词集: -> ...
         
      • 创建新的单词集...
    • 拷贝
  • 相关阅读:
    Python 高级编程系列__03:python 中常见的内置类型
    Python 高级编程系列__02:type、object、class 的关系
    Python 高级编程系列__01:一切皆对象
    Mac 修改默认python的版本
    swap指令实现互斥
    什么是进程同步?wait( )是如何实现进程同步的?
    可执行文件加载时进行了哪些处理?
    C++不允许使用不完整的类型说明
    error LNK2019: 无法解析的外部符号
    抽屉原理——放苹果
  • 原文地址:https://www.cnblogs.com/sy-liu/p/13294478.html
Copyright © 2020-2023  润新知