zoukankan      html  css  js  c++  java
  • 命令模式

      命令模式:将“请求”封装成对象,以便使用不同的请求,队列或日志来参数化其他对象。命令模式也支持撤销的操作。

      通过封装方法调用,我们可以把运算块包装成形。所以调用此运算的对象不需要关心事情是如何进行的,只需要知道如何使用包装成形的方法来完成它就可以了。

      一个命令对象(如下文的LightOnCommand)通过在特定的接收者(Light)上绑定一组动作(On())来封装一个请求,要达到这一点,命令对象将动作和接收者包进对象中。这个对象只暴露一个类似Excute()的方法,当此方法被调用时,接收者就会执行这些动作。

      接收者存在的必要性(解耦):一般来说,我们尽量设计“傻瓜”命令对象,它只知道调用一个接收者的行为。然而许多“聪明”的命令对象会实现许多逻辑,直接完成一个请求,这样一来,调用者和接收者之间的解耦程度比不上“傻瓜”命令对象。

      代码示例:

    1.实现命令接口

    public interface Command
    {
        public void Excute();
    }

    2.实现一个打开电灯的命令对象

    public class LightOnCommand implements Command
    {
        // 电灯对象
        Light light;
    
        public LightOnCommand(Light light)
        {
            // 构造器传入某个电灯,以便让这个命令对象控制,然后记录在实例变量中。
            // 一旦调用Excute()方法,这个电灯对象就会成为接收者,负责接收请求。
            this.light = light;    
        }
    
        public void Excute()
        {
            // 命令对象调用接收者(light)的方法。
            light.On();             
        }
    }

    3.使用LightOnCommand类

    // 简易遥控器
    public class SimpleRemoteControl          
    {
        // 有一个插槽持有命令,这个命令控制着一个装置 
        Command slot;                              
    
        public SimpleRemoteControl() {}
    
        public void SetCommand(Command command)
        {
            // 设置插槽控制命令,客户可以调用该方法设置遥控器的行为
            slot = command;                      
        }
    
        public void buttonWasPressed()
        {
            // 当按下遥控器按钮,当前命令衔接插槽,并调用Excute()方法
            // 从该方法也可以看出,发出请求的对象(SimpleRemoteControl)与接收与执行这些请求的对象(Light)之间的解耦关系
            slot.Excute();       
        }
    }
  • 相关阅读:
    解决Docker时区与主机时区不一致的问题
    删除k8s中一直处于Terminating的资源
    多块盘制作成一个lvm
    Docker mysql启动自动按顺序导入sql
    linux中nfs启动报rpcbind.socket failed to listen on sockets: Address family not supported by protocol
    k8s容器挂载配置文件
    ssh到远程执行命令并返回
    安全组
    Python 字符串操作函数二
    Python 字符串操作函数一
  • 原文地址:https://www.cnblogs.com/hachun/p/3564411.html
Copyright © 2011-2022 走看看