• JAVA设计模式-命令模式


    1、例子

    1) 我们买了一套智能家电,有照明灯、风扇、冰箱、洗衣机,我们只要在手机上安装 app
    可以控制对这些家电工作。
    2) 这些智能家电来自不同的厂家,我们不想针对每一种家电都安装一个 App ,分别控制,我
    们希望只要一个 app 就可以控制全部智能家电。
    3) 要实现一个 app 控制所有智能家电的需要,则每个智能家电厂家都要提供一个统一的接口
    app 调用,这时 就可以考虑使用命令模式。
    4) 命令模式可将“动作的请求者”从“动作的执行者”对象中解耦出来 .
    5) 在我们的例子中,动作的请求者是手机 app ,动作的执行者是每个厂商的一个家电产品 命令模
    基本定义:
    在软件设计中,我们经常需要
    向某些对象发送请求,但是并不知道请求的接收者是谁,也不知
    道被请求的操作是哪个,
    1) 我们只需在程序运行时指定具体的请求接收者即可,此时,可以
    使用命令模式来进行设计
    2) 命名模式使得请求发送者与请求接收者消除彼此之间的耦合,让
    对象之间的调用关系更加灵活,实现解耦。
    3) 在命名模式中,会将一个请求封装为一个对象,以便使用不同参
    数来表示不同的请求 ( 即命名 ) ,同时命令模式也支持可撤销的操作。
    有点类似消息的广播模式

     

    3、代码

     

    1. public class RemoteController {
    2. //开 按钮的命令数组
    3. Command[] onCommands;
    4. Command[] offComands;
    5. //执行撤销的命令
    6. Command undoCommand;
    7. //构造器,完成对按钮的初始化
    8. public RemoteController() {
    9. onCommands=new Command[5];
    10. offComands=new Command[5];
    11. for (int i = 0; i < 5; i++) {
    12. onCommands[i]=new NoCommand();
    13. offComands[i]=new NoCommand();
    14. }
    15. }
    16. //给我们的按钮设置你需要的命令
    17. public void setCommand(int no,Command onCommand,Command offComand){
    18. onCommands[no]=onCommand;
    19. offComands[no]=offComand;
    20. }
    21. //按下开按钮
    22. public void onButtonWasPushed(int no){
    23. onCommands[no].execute();
    24. undoCommand=onCommands[no];
    25. }
    26. //按下开按钮
    27. public void offButtonWasPushed(int no){
    28. offComands[no].execute();
    29. undoCommand=offComands[no];
    30. }
    31. //按下撤销按钮
    32. public void undoButtonWasPushed(){
    33. undoCommand.undo();
    34. }
    35. }

     

    1. public class LightOnCommand implements Command {
    2. //聚合LightReceiver
    3. LightReceiver light;
    4. //构造器
    5. public LightOnCommand(LightReceiver light) {
    6. this.light = light;
    7. }
    8. @Override
    9. public void execute() {
    10. light.on();
    11. }
    12. @Override
    13. public void undo() {
    14. light.off();
    15. }
    16. }
    1. public class LightOffCommand implements Command {
    2. //聚合LightReceiver
    3. LightReceiver light;
    4. //构造器
    5. public LightOffCommand(LightReceiver light) {
    6. this.light = light;
    7. }
    8. @Override
    9. public void execute() {
    10. light.off();
    11. }
    12. @Override
    13. public void undo() {
    14. light.on();
    15. }
    16. }
    1. public interface Command {
    2. public void execute();
    3. public void undo();
    4. }
    1. public class LightReceiver {
    2. public void on(){
    3. System.out.println("电灯打开了");
    4. }
    5. public void off(){
    6. System.out.println("电灯关闭了");
    7. }
    8. }
    1. public class Client {
    2. public static void main(String[] args) {
    3. LightReceiver lightReceiver = new LightReceiver();
    4. LightOnCommand lightOnCommand = new LightOnCommand(lightReceiver);
    5. LightOffCommand lightOffCommand = new LightOffCommand(lightReceiver);
    6. RemoteController remoteController = new RemoteController();
    7. remoteController.setCommand(0,lightOnCommand,lightOffCommand);
    8. System.out.println("开始");
    9. remoteController.onButtonWasPushed(0);
    10. System.out.println("关闭");
    11. remoteController.offButtonWasPushed(0);
    12. System.out.println("撤销");
    13. remoteController.undoButtonWasPushed();
    14. System.out.println("___________________");
    15. TVReceiver tvReceiver = new TVReceiver();
    16. TVOffCommand tvOffCommand = new TVOffCommand(tvReceiver);
    17. TVOnCommand tvOnCommand = new TVOnCommand(tvReceiver);
    18. remoteController.setCommand(1,tvOnCommand,tvOffCommand);
    19. System.out.println("开始");
    20. remoteController.onButtonWasPushed(1);
    21. System.out.println("关闭");
    22. remoteController.offButtonWasPushed(1);
    23. System.out.println("撤销");
    24. remoteController.undoButtonWasPushed();
    25. }
    26. }

    总结:把逻辑流程抽象,底部实现类,改为插拔式

  • 相关阅读:
    后端各种格式传参混合vue前端传参
    系列五、线程间通信
    Redis笔记进阶篇:万字长文-整理Redis,各种知识点,建议收藏
    综述、浏览器外观(Actions、右键菜单、桌面通知)
    amd羿龙CPU A320系列主板如何安装win7
    区间预测 | MATLAB实现QRCNN-BiLSTM卷积双向长短期记忆神经网络分位数回归时间序列区间预测
    网页元素解析a标签
    SCADA系统原理
    Debian 11 AMD Install driver(wifi...)
    倒计时1天 | 图技术如何赋能产业互联网创新?
  • 原文地址:https://blog.csdn.net/CB_Beginner/article/details/127590928