Command 命令模式

狄宇
2023-12-01

定义

命令模式是一种数据驱动的设计模式,它属于行为型模式。

请求以命令的形式包裹在对象中,并传给调用对象。调用对象寻找可以处理该命令的合适的对象,并把该命令传给相应的对象,该对象执行命令。

命令模式使请求发送者与请求接收者消除彼此之间的耦合,让对象之间的调用关系更加灵活,实现解耦。

优缺点

优点

  • 降低了系统耦合度。
  • 可拓展性强,新的命令可以很容易添加到系统中去。

缺点

  • 使用命令模式可能会导致某些系统有过多的具体命令类。

组成

  • received:接收者对象。
  • Command:命令对象。
  • invoker:调用者对象。
  • Controller: 将一个接收者对象与一个动作绑定,调用接收者响应的操作 。

实现

开关电灯

接收者received

/**
 * 电灯(接收者)
 */
public class LightReceiver {
    public void on() {
        System.out.println(" 电灯打开了.. ");
    }

    public void off() {
        System.out.println(" 电灯关闭了.. ");
    }
}

命令对象接口Command

/**
 * 命令对象
 */
public interface Command {
    //执行动作(操作)
    void execute();

    //撤销动作(操作)
    void undo();
}

Command实现类

/**
 * 开灯
 */
public class LightOnCommand implements Command {
    LightReceiver light;

    public LightOnCommand(LightReceiver light) {
        super();
        this.light = light;
    }

    @Override
    public void execute() {
        //调用接收者的方法
        light.on();
    }

    @Override
    public void undo() {
        //调用接收者的方法
        light.off();
    }
}
/**
 * 关灯
 */
public class LightOffCommand implements Command {
    LightReceiver light;

    public LightOffCommand(LightReceiver light) {
        super();
        this.light = light;
    }

    @Override
    public void execute() {
        // 调用接收者的方法
        light.off();
    }

    @Override
    public void undo() {
        // 调用接收者的方法
        light.on();
    }
}

控制器Controller

/**
 * Controller
 */
public class RemoteController {
    // 开关按钮的命令数组
    Command onCommands;
    Command offCommands;
    // 撤销的命令
    Command undoCommand;

    public void setCommand(Command onCommand, Command offCommand) {
        onCommands = onCommand;
        offCommands = offCommand;
    }

    public void onButtonWasPushed() {
        // 开的按钮
        onCommands.execute();
        // 记录这次的操作,用于撤销
        undoCommand = onCommands;
    }

    public void offButtonWasPushed() {
        // 关的按钮
        offCommands.execute();
        // 记录这次的操作,用于撤销
        undoCommand = offCommands;
    }

    // 撤销按钮
    public void undoButtonWasPushed() {
        undoCommand.undo();
    }
}

Main

public class Main {
    public static void main(String[] args) {
        //创建电灯的对象(接受者)
        LightReceiver lightReceiver = new LightReceiver();
        //创建电灯相关的开关命令
        LightOnCommand lightOnCommand = new LightOnCommand(lightReceiver);
        LightOffCommand lightOffCommand = new LightOffCommand(lightReceiver);
        //需要一个遥控器
        RemoteController remoteController = new RemoteController();
        //给我们的遥控器设置命令
        remoteController.setCommand(lightOnCommand, lightOffCommand);
        
        System.out.println("--------按下灯的开按钮-----------");
        remoteController.onButtonWasPushed();
        System.out.println("--------按下灯的关按钮-----------");
        remoteController.offButtonWasPushed();
        System.out.println("--------按下撤销按钮-----------");
        remoteController.undoButtonWasPushed();
    }
}

---------结果----------

--------按下灯的开按钮-----------
 电灯打开了.. 
--------按下灯的关按钮-----------
 电灯关闭了.. 
--------按下撤销按钮-----------
 电灯打开了.. 
 类似资料: