搜索
您的当前位置:首页正文

设计模式- 命令模式(Command Pattern)

来源:二三娱乐

定义

命令模式的目的是解除命令发出者和接收者之间的紧密耦合关系,使二者相对独立,有利于程序的并行开发和代码的维护。命令模式的核心思想是将请求封装为一个对象,将其作为命令发起者和接收者的中介,而抽象出来的命令对象又使得能够对一系列请求进行操作,如对请求进行排队,记录请求日志以及支持可撤销的操作等。

C#例子

    public abstract class Command
    {
        public abstract void Excute(Receiver receiver);
    }

    public class CreateOrderCommand : Command
    {
        public override void Excute(Receiver receiver)
        {
            Console.WriteLine("创建单据完成!");
        }
    }
    public class ChangeStockCommand : Command
    {
        public override void Excute(Receiver receiver)
        {
            Console.WriteLine("扣减库存完成!");
        }
    }

    public class Receiver
    {
    }

    public class Invoker
    {
        private IList<Command> _commands = new List<Command>();

        public Invoker AddCommand(Command command) {
            _commands.Add(command);
            return this;
        }

        public void Excute(Receiver receiver) {
            foreach (var command in _commands) {
                command.Excute(receiver);
            }
        }
    }
    class Program
    {
        static void Main(string[] args)
        {
            Receiver receiver = new Receiver();
            new Invoker()
                .AddCommand(new CreateOrderCommand())
                .AddCommand(new ChangeStockCommand())
                .Excute(receiver);
        }
    }

命令模式参与者:

  • Command:命令抽象类,声明一个执行操作的接口Execute,该抽象类并不实现这个接口,所有的具体命令都继承自命令抽象类。
  • *Command:Command的实现类,定义一个接收者对象与动作之间的请求绑定,调用Receiver的操作,实现Execute方法
  • Invoker:命令的接收者,将命令请求传递给相应的命令对象,每个*Command都是一个Invoker的成员
  • Receiver:命令的接收者,知道如何实施与执行一个请求相关的操作

命令模式适用情形:

  • 将用户界面和行为分离,使两者的开发可以并行不悖。
  • 在需要指定、排列和执行一系列请求的情况下,适用命令模式。
  • 支持修改日志。

命令模式优点:

  • 命令模式将调用操作对象和知道如何实现该操作对象的解耦。

  • 在Command要增加新的处理操作对象很容易,可以通过创建新的继承自Command的子类来实现。

  • 命令模式可以和Memento模式结合使用,支持取消的操作。

  • 支持日志、请求队列和复合命令。

其他

源码地址

其他设计模式

Top