Command 命令模式

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

  • 1. 简介
  • 2. 示例

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();
    }
}
(0)

相关推荐

  • C#方法的重载

    C#方法的重载 方法重载是指在一个类中定义多个同名的方法,但要求每个方法具有不同的参数的类型或参数的个数.调用重载方法时,编译器能通过检查调用的方法的参数类型和个数选择一个恰当的方法.方法重载通常用于 ...

  • WPF之命令

    命令系统的基本元素 WPF的命令系统由几个基本要素构成: 命令(Command):WPF的命令实际上就是实现了ICommand接口的类,平时使用最多的是RoutedCommand类,还可以使用自定义命 ...

  • 图解Java设计模式之命令模式

    智能生活项目需求 命令模式基本介绍 命令模式的原理类图 命令模式在Spring框架中JdbcTemplate应用源码分析 命令模式的注意事项和细节 智能生活项目需求 看一个具体的需求 我们买类一套智能 ...

  • 【Java设计模式】 Java设计模式之(六)命令模式(Command Pattern)

    命令模式(Command Pattern)是一种数据驱动的设计模式,它属于行为型模式.请求以命令的形式包裹在对象中,并传给调用对象.调用对象寻找可以处理该命令的合适的对象,并把该命令传给相应的对象,该 ...

  • java设计模式-命令模式(Command)

    定义命令模式属于对象的行为模式.命令模式又称为行动(Action)模式或者交易(Transaction)模式.命令模式把一个请求或者操作封装到一个对象中.命令模式允许系统使用不同的请求把客户端参数化, ...

  • 设计模式(十五)——命令模式(Spring框架的JdbcTemplate源码分析)

    设计模式(十五)——命令模式(Spring框架的JdbcTemplate源码分析)

  • Java设计模式【命令模式】

    命令模式 命令模式很好理解,举个例子,司令员下令让士兵去干件事情,从整个事情的角度来考虑,司令员的作用是,发出口令,口令经过传递,传到了士兵耳朵里,士兵去执行.这个过程好在,三者相互解耦,任何一方都不 ...

  • PHP设计模式之命令模式

    PHP设计模式之命令模式 命令模式,也称为动作或者事务模式,很多教材会用饭馆来举例.作为顾客的我们是命令的下达者,服务员是这个命令的接收者,菜单是这个实际的命令,而厨师是这个命令的执行者.那么,这个模 ...

  • [PHP小课堂]PHP设计模式之命令模式

    [PHP小课堂]PHP设计模式之命令模式 关注公众号:[硬核项目经理]获取最新文章 添加微信/QQ好友:[DarkMatterZyCoder/149844827]免费得PHP.项目管理学习资料

  • CommandPattern命令模式

    命令模式 1.定义 将一个请求封装成一个对象,从而可以使用不同的请求来参数化客户端. 命令模式通常有3种角色 Receiver:接收者角色.负责执行命令的角色 抽象接收者:具有所有特性的接收者的集合 ...

  • 命令模式

    一.命令模式介绍 1.定义与类型 定义:将"请求"封装成对象,以便使用不同的请求 命令模式解决了应用程序中对象的职责以及它们之间的通信方式 类型:行为型 2.适用场景 请求调用者和 ...