• Command 命令模式


    >>返回《C#常用设计模式》

    1. 简介

    方法调用封装起来: 通过封装方法调用,可以把运算块封装成形,所以调用此运算对象不需要知道事情是如何进行的。通过封装方法调用,可以实现一些很聪明的事,比如日志记录。

    • 类图

      其中提到的一个Command,可能为多个
    • 日志的封装
      • Ilogger就是Invoker
      • ILogger中的info、warn等方法就是执行的Command
      • Receiver就是对应:FileWriter、DBWriter

    2. 示例

    
    //遥控器 Invoker
    public class RemoteControl
    {
        private readonly ICommand _onCommand;
        private readonly ICommand _offCommand;
    
        public RemoteControl()
        {
            var noCommand = new NoCommand();
            _onCommands = noCommand;
            _offCommands = noCommand;
        }
    
        public void SetCommand(ICommand onCommand, ICommand offCommand)
        {
            _onCommand = onCommand;
            _offCommand = offCommand;
        }
    
        public void OnButtonWasPushed()
        {
            _onCommand.Execute();
        }
    
        public void OffButtonWasPushed()
        {
            _offCommand.Execute();
        }
    }
    
    //Command
    public interface ICommand
    {
        void Execute();
        void Undo();
    }
    
    //NoCommand对象是一个空对象,当你不想返回一个有意义的对象时,空对象就很有用
    public class NoCommand : ICommand
    {
        public void Execute()
        {
            Console.WriteLine("No command was executed!");
        }
        public void Undo()
        {
            Console.WriteLine("No command was executed!");
        }
    }
    
    //ConcreteCommand
    public class LightOffCommand : ICommand
    {
        private readonly Light _light;
    
        public LightOffCommand(Light light)
        {
            _light = light;
        }
    
        public void Execute()
        {
            _light.Off();
        }
    
        public void Undo()
        {
            _light.On();
        }
    }
    public class LightOnCommand : ICommand
    {
        private readonly Light _light;//这个字段就是ConcreteCommand中的一个Receiver,多用组合少用继承!
    
        public LightOnCommand(Light light)
        {
            _light = light;
        }
    
        public void Execute()
        {
            _light.On();
        }
    
        public void Undo()
        {
            _light.Off();
        }
    }
    
    //Receiver
    public class Light
    {
        public void On()
        {
            Console.WriteLine("light's on");
        }
    
        public void Off()
        {
            Console.WriteLine("light's off");
        }
    }
    
    class Program
    {
        static void Main(string[] args)
        {
            var control = new RemoteControl();
            var light = new Light();
            var lightOnCommand = new LightOnCommand(light);
            var lightOffCommand = new LightOffCommand(light);
    
            control.SetCommand(lightOnCommand, lightOffCommand);
            control.OnButtonWasPushed();
            Console.ReadKey();
        }
    }
    

    如果您认为这篇文章还不错或者有所收获,您可以通过右边的"打赏"功能 打赏我一杯咖啡【物质支持】,也可以点击左下角的【好文要顶】按钮【精神支持】,因为这两种支持都是我继续写作,分享的最大动力!

    作者: 大师兄石头
    来源: https://bigbrotherstone.cnblogs.com/
    声明: 原创博客请在转载时保留原文链接或者在文章开头加上本人博客地址,如发现错误,欢迎批评指正。凡是转载于本人的文章,不能设置打赏功能,如有特殊需求请与本人联系!

  • 相关阅读:
    二叉搜索树的建树与遍历
    SpringBoot Mybatis 读写分离配置(山东数漫江湖)
    Spring注解概览(数漫江湖)
    Spring Cloud的基本认识和使用Spring Cloud的基本教程(山东数漫江湖)
    全面了解Nginx主要应用场景(数漫江湖)
    Spring boot集成RabbitMQ(山东数漫江湖)
    Spring 事务管理(山东数漫江湖)
    透彻理解Spring事务设计思想之手写实现(山东数漫江湖)
    Spring整合Quartz分布式调度(山东数漫江湖)
    Spring归纳小结(山东数漫江湖)
  • 原文地址:https://www.cnblogs.com/BigBrotherStone/p/command.html
Copyright © 2020-2023  润新知