当前位置: 首页 > article >正文

命令设计模式

命令模式

  • 命令模式定义:
    • 使用场景
      • 1、遥控器:遥控器是一种典型的命令模式应用,遥控器中的每一个按钮都对应着一个命令对象,当用户按下按钮时,遥控器会发送相应的命令对象给电器,电器会根据命令对象来执行相应的操作。
      • 2、厨师和服务员:在餐厅中,厨师和服务员之间的关系可以看作是一种命令模式。服务员负责接收顾客的点餐请求,将请求封装成一个命令对象,并将命令对象发送给厨师。厨师会根据命令对象来烹饪相应的菜品,完成后将菜品交给服务员。
      • 3、智能家居:智能家居系统中,用户可以通过手机或者语音控制设备的开关、调节亮度等操作。这些操作都可以看作是命令对象,当用户发送一个命令对象时,智能家居系统会根据命令对象来控制相应的设备。
      • 4、播放器:在音乐或者影视播放器中,用户可以通过命令对象来控制音乐或者影片的播放、暂停、快进等操作。播放器会根据命令对象来执行相应的操作。
    • 角色定义
      • Receive 接收者角色
      • Command 命令角色
      • lnvoker 调用者角色
    • 需求背景
      • 1、定义接收者角色 Receiver,包含电视机的操作方法,如开关、音量和频道控制等。
      • 2、定义命令接口 Command,包含执行命令的方法 execute()。
      • 3、定义具体命令类 ConcreteCommand,实现 Command 接口,包含一个接收者对象和一个执行命令的方法 execute(),在执行命令时调用接收者对象的相应方法。
      • 4、定义调用者角色 Invoker,包含一个命令对象和一个执行命令的方法 executeCommand(),在执行命令时调用命令对象的 execute() 方法。
      • 5、编写测试案例,创建一个遥控器对象和一个电视机对象,分别创建开机、关机、调节频道和音量的命令对象,并将命令对象设置到遥控器对象中,最后执行遥控器对象的执行命令方法。
      • 6、输出结果
      • 7、总结

命令模式定义:

将一个请求封装成一个对象,从而让你使用不同的请求把客户端参数化

使用场景

1、遥控器:遥控器是一种典型的命令模式应用,遥控器中的每一个按钮都对应着一个命令对象,当用户按下按钮时,遥控器会发送相应的命令对象给电器,电器会根据命令对象来执行相应的操作。

2、厨师和服务员:在餐厅中,厨师和服务员之间的关系可以看作是一种命令模式。服务员负责接收顾客的点餐请求,将请求封装成一个命令对象,并将命令对象发送给厨师。厨师会根据命令对象来烹饪相应的菜品,完成后将菜品交给服务员。

3、智能家居:智能家居系统中,用户可以通过手机或者语音控制设备的开关、调节亮度等操作。这些操作都可以看作是命令对象,当用户发送一个命令对象时,智能家居系统会根据命令对象来控制相应的设备。

4、播放器:在音乐或者影视播放器中,用户可以通过命令对象来控制音乐或者影片的播放、暂停、快进等操作。播放器会根据命令对象来执行相应的操作。

角色定义

Receive 接收者角色

该角色就是干活的角色,命令传递到这里是应该被执行的。

Command 命令角色

需要执行的所有命令都在这里声明.

lnvoker 调用者角色

接收到命令,并执行命令。

需求背景

设计一个遥控器,用户可以通过遥控器控制电视机的开关、音量和频道。

1、定义接收者角色 Receiver,包含电视机的操作方法,如开关、音量和频道控制等。

public class TV {
    public void turnOn() {
        System.out.println("TV is on");
    }

    public void turnOff() {
        System.out.println("TV is off");
    }

    public void changeChannel(int channel) {
        System.out.println("TV channel is changed to " + channel);
    }

    public void adjustVolume(int volume) {
        System.out.println("TV volume is adjusted to " + volume);
    }
}

2、定义命令接口 Command,包含执行命令的方法 execute()。

public interface Command {
    void execute();
}

3、定义具体命令类 ConcreteCommand,实现 Command 接口,包含一个接收者对象和一个执行命令的方法 execute(),在执行命令时调用接收者对象的相应方法。

public class TurnOnCommand implements Command {
    private TV tv;

    public TurnOnCommand(TV tv) {
        this.tv = tv;
    }

    @Override
    public void execute() {
        tv.turnOn();
    }
}

public class TurnOffCommand implements Command {
    private TV tv;

    public TurnOffCommand(TV tv) {
        this.tv = tv;
    }

    @Override
    public void execute() {
        tv.turnOff();
    }
}

public class ChangeChannelCommand implements Command {
    private TV tv;
    private int channel;

    public ChangeChannelCommand(TV tv, int channel) {
        this.tv = tv;
        this.channel = channel;
    }

    @Override
    public void execute() {
        tv.changeChannel(channel);
    }
}

public class AdjustVolumeCommand implements Command {
    private TV tv;
    private int volume;

    public AdjustVolumeCommand(TV tv, int volume) {
        this.tv = tv;
        this.volume = volume;
    }

    @Override
    public void execute() {
        tv.adjustVolume(volume);
    }
}

4、定义调用者角色 Invoker,包含一个命令对象和一个执行命令的方法 executeCommand(),在执行命令时调用命令对象的 execute() 方法。

public class RemoteControl {
    private Command command;

    public void setCommand(Command command) {
        this.command = command;
    }

    public void executeCommand() {
        command.execute();
    }
}

5、编写测试案例,创建一个遥控器对象和一个电视机对象,分别创建开机、关机、调节频道和音量的命令对象,并将命令对象设置到遥控器对象中,最后执行遥控器对象的执行命令方法。

public class Test {
    public static void main(String[] args) {
        TV tv = new TV();
        RemoteControl remoteControl = new RemoteControl();

        Command turnOnCommand = new TurnOnCommand(tv);
        Command turnOffCommand = new TurnOffCommand(tv);
        Command changeChannelCommand = new ChangeChannelCommand(tv, 3);
        Command adjustVolumeCommand = new AdjustVolumeCommand(tv, 50);

        remoteControl.setCommand(turnOnCommand);
        remoteControl.executeCommand();

        remoteControl.setCommand(changeChannelCommand);
        remoteControl.executeCommand();

        remoteControl.setCommand(adjustVolumeCommand);
        remoteControl.executeCommand();

        remoteControl.setCommand(turnOffCommand);
        remoteControl.executeCommand();
    }
}

6、输出结果

TV is on
TV channel is changed to 3
TV volume is adjusted to 50
TV is off

7、总结

命令模式可以将请求和处理请求的对象解耦,使得请求者和接收者之间没有直接关系,从而提高系统的灵活性和可扩展性。在本案例中,遥控器充当了调用者角色,电视机充当了接收者角色,四个具体命令类充当了命令角色,将请求和处理请求的对象解耦,使得用户可以通过遥控器来控制电视机的开关、音量和频道。


http://www.kler.cn/a/17706.html

相关文章:

  • CTF攻防世界小白刷题自学笔记13
  • 鸿蒙HarmonyOS 地图不显示解决方案
  • 记录使用documents4j来将word文件转化为pdf文件
  • Spring Boot实现文件上传与OSS集成:从基础到应用
  • Python →爬虫实践
  • LabVIEW开发相机与显微镜自动对焦功能
  • python基本数据类型---数字字符串
  • 有关教育的几段话
  • 基于zookeeper实现分布式锁
  • 【无人车】无人驾驶地面车辆避障研究(Matlab代码实现)
  • 特征向量中心度(Eigenvector Centrality)
  • Kali 安装中文输入法(超详细)
  • 中级软件设计师备考---软件工程1
  • git上传大大大文件项目好折磨人
  • k8s之审计日志
  • 微机作业题
  • 字节跳动测试岗面试挂在2面,复盘后,我总结了失败原因,决定再战一次...
  • (别再手动点APP了)UiAutomator2自动化测试框架带你玩转APP操作
  • 模拟银行账户转账业务
  • 【软件测试】测试分类
  • 《花雕学AI》28:革命性的 ChatGPT for SEO——让您的排名飙升 50%!
  • 人脸识别--传统+深度方法
  • 【GAMES101】04 Viewing Transformation
  • LVS+Keepalived 高可用群集部署
  • 如何发起一次完整的HTTP的请求流程
  • NLP模型(四)——seq2seq模型与Attention机制实现