设计模式-命令模式

命令模式

角色

  • 接受者(Receiver)
    请求的实际作用对象
  • 抽象命令(Command)
    声明了执行请求的execute方法
  • 具体命令(ConcreteCommand)
    调用实际操作对象,实现execute
  • 调用者(Invoker)
    调用命令请求发送者

案例

功能键绑定

比如遥控器的功能键,现在想要实现为功能可以自定义绑定事件,请使用命令模式实现

WindowsHelper:接收者

/**
 * Receiver
 */
public class WindowHelper {
    public void min(){
        System.out.println("窗口最小化");
    }

    public void exit(){
        System.out.println("窗口退出");
    }
}

Command:抽象命令

/**
 * Command
 */
public interface Command {
    public void execute();
}

MinCmd:窗口退出命令

/**
 * ConcreteCommand:ExitCmd
 */
public class ExitCmd implements Command{
    private WindowHelper windowHelper;

    public ExitCmd() {
        this.windowHelper = new WindowHelper();
    }

    @Override
    public void execute() {
        this.windowHelper.exit();
    }
}

ExitCmd:窗口最小化命令

/**
 * ConcreteCommand:MinCmd
 */
public class MinCmd implements Command{
    private WindowHelper windowHelper;

    public MinCmd() {
        this.windowHelper = new WindowHelper();
    }

    @Override
    public void execute() {
        this.windowHelper.min();
    }
}

FxBtn:功能键Invoker

/**
 * Invoker
 */
public class FxBtn {
    private Command command;

    private String name;

    public FxBtn(String name) {
        this.name = name;
    }

    public void onClick() {
        this.command.execute();
    }

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

Main

public class Main {
    public static void main(String... args){
        /**
         * 创建两个功能键
         */
        FxBtn btn1 = new FxBtn("minilize");
        FxBtn btn2 = new FxBtn("Exit");
        /**
         * 创建两个命令
         */
        Command cmd1 = new MinCmd();
        Command cmd2 = new ExitCmd();
        /**
         * 为功能键绑定命令
         */
        btn1.bindCommand(cmd1);
        btn2.bindCommand(cmd2);

        btn1.onClick();
        btn2.onClick();
        /**
         * 交换一下
         */
        btn1.bindCommand(cmd2);
        btn2.bindCommand(cmd1);

        btn1.onClick();
        btn2.onClick();
    }
}

Output:

窗口最小化
窗口退出
窗口退出
窗口最小化

命令模式优缺点

优点:

  1. 降低了系统耦合度,请求者和目标对象之间不直接引用
  2. 容易拓展新命令,符合开闭原则
  3. 可以配合队列实现命令批处理、宏命令
  4. 容易实现命令的 Undo 和 Redo 操作

缺点:

  1. 可能导致系统具有过多的命令类。

应用场景

  1. 需要将请求者和接收者解耦
  2. 分时请求
  3. 需要实现 Redo 和 Undo
  4. 命令组成宏命令

你可能感兴趣的:(设计模式,命令模式,设计模式,java,笔记)