zoukankan      html  css  js  c++  java
  • 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/
    声明: 原创博客请在转载时保留原文链接或者在文章开头加上本人博客地址,如发现错误,欢迎批评指正。凡是转载于本人的文章,不能设置打赏功能,如有特殊需求请与本人联系!

  • 相关阅读:
    在Mac电脑编译c51程序
    Unix程序员的Win10二三事
    macOS webview编程
    Day 6 文件属性与命令执行流程
    Day 5文件管理—三剑客的了解
    Day4 文件管理-常用命令
    Day3 目录结构及文件管理
    Day 2 Bash shell 认识
    Day 1 linux系统的发展史与虚拟机的安装过程
    【Offer】[66] 【构建乘积数组】
  • 原文地址:https://www.cnblogs.com/BigBrotherStone/p/command.html
Copyright © 2011-2022 走看看