类图如下:
    Command.png

    创建Command接口:

    1. /*命令接口*/
    2. public interface Command {
    3. /*执行命令*/
    4. void execute();
    5. /*撤销命令*/
    6. void undo();
    7. }

    创建Command接口的实现类NoCommand,该不执行任何指令:

    1. /*什么都不做命令*/
    2. public class NoCommand implements Command{
    3. @Override
    4. public void execute() {
    5. }
    6. @Override
    7. public void undo() {
    8. }
    9. }

    创建电灯类Light,命令接收者,也就是LightOnCommand、LightOffCommand真正的执行者:

    1. /**
    2. * 家具: 电灯
    3. * Receiver:命令接收者,也就是命令真正的执行者
    4. */
    5. public class Light {
    6. /*执行命令*/
    7. public void on() {
    8. System.out.println("打开 电灯 ......");
    9. }
    10. /*撤销命令*/
    11. public void off() {
    12. System.out.println("关闭 电灯 ......");
    13. }
    14. }

    创建Command接口的实现类LightOnCommand,控制电灯开操作:

    1. /*电灯 开 命令*/
    2. public class LightOnCommand implements Command {
    3. private Light light;
    4. public LightOnCommand(Light light) {
    5. this.light = light;
    6. }
    7. @Override
    8. public void execute() {
    9. light.on();
    10. }
    11. @Override
    12. public void undo() {
    13. light.off();
    14. }
    15. }

    创建Command接口的实现类LightOffCommand,控制电灯关操作:

    1. /*电灯 关 命令*/
    2. public class LightOffCommand implements Command {
    3. private Light light;
    4. public LightOffCommand(Light light) {
    5. this.light = light;
    6. }
    7. @Override
    8. public void execute() {
    9. light.off();
    10. }
    11. @Override
    12. public void undo() {
    13. light.on();
    14. }
    15. }

    创建电视类TV,命令接收者,也就是TVOnCommand、TVOffCommand真正的执行者:

    1. /**
    2. * 家具: 电视
    3. * Receiver:命令接收者,也就是命令真正的执行者
    4. */
    5. public class TV {
    6. /*执行命令*/
    7. public void on() {
    8. System.out.println("打开 电视 ......");
    9. }
    10. /*撤销命令*/
    11. public void off() {
    12. System.out.println("关闭 电视 ......");
    13. }
    14. }

    创建Command接口的实现类TVOnCommand,控制电视开操作:

    1. /*电视 开 命令*/
    2. public class TVOnCommand implements Command {
    3. private TV tv;
    4. public TVOnCommand(TV tv) {
    5. this.tv = tv;
    6. }
    7. @Override
    8. public void execute() {
    9. tv.on();
    10. }
    11. @Override
    12. public void undo() {
    13. tv.off();
    14. }
    15. }

    创建Command接口的实现类TVOffCommand,控制电视关操作:

    1. /*电视 关 命令*/
    2. public class TVOffCommand implements Command {
    3. private TV tv;
    4. public TVOffCommand(TV tv) {
    5. this.tv = tv;
    6. }
    7. @Override
    8. public void execute() {
    9. tv.off();
    10. }
    11. @Override
    12. public void undo() {
    13. tv.on();
    14. }
    15. }

    创建遥控器类RemoteControl,通过它来调用命令,控制家用电器:

    1. /**
    2. * 遥控器
    3. * Invoker:通过它来调用命令,
    4. */
    5. public class RemoteControl {
    6. private int arrayLength = 5;
    7. /*遥控器上 开这一列 的命令*/
    8. private Command[] onCommandArray = new Command[arrayLength];
    9. /*遥控器上 关这一列 的命令*/
    10. private Command[] offCommandArray = new Command[arrayLength];
    11. /*遥控器上 撤销这一列 的命令*/
    12. private Command[] undoCommandArray = new Command[arrayLength];
    13. public RemoteControl() {
    14. for (int i = 0; i < arrayLength; i++) {
    15. onCommandArray[i] = new NoCommand();
    16. offCommandArray[i] = new NoCommand();
    17. undoCommandArray[i] = new NoCommand();
    18. }
    19. }
    20. public void setCommand(int index, Command onCommand, Command offCommand) {
    21. onCommandArray[index] = onCommand;
    22. offCommandArray[index] = offCommand;
    23. }
    24. public void onButtonPushed(int index) {
    25. onCommandArray[index].execute();
    26. undoCommandArray[index] = onCommandArray[index];
    27. }
    28. public void offButtonPushed(int index) {
    29. offCommandArray[index].execute();
    30. undoCommandArray[index] = offCommandArray[index];
    31. }
    32. public void undoButtonPushed(int index) {
    33. undoCommandArray[index].undo();
    34. }
    35. }

    客户端:

    1. /*客户端*/
    2. public class Client {
    3. public static void main(String[] args) {
    4. // 创建一个遥控器
    5. RemoteControl remoteControl = new RemoteControl();
    6. System.out.println("=================== 操作电灯相关指令 =======================");
    7. // 设置电灯的相关指令
    8. Light light = new Light();
    9. Command lightOnCommand = new LightOnCommand(light);
    10. Command lightOffCommand = new LightOffCommand(light);
    11. // 将电灯的命令,绑定到遥控器上
    12. remoteControl.setCommand(0, lightOnCommand, lightOffCommand);
    13. //操作 电灯
    14. System.out.println("------- 打开 ---------");
    15. remoteControl.onButtonPushed(0);
    16. System.out.println("------- 关闭 ---------");
    17. remoteControl.offButtonPushed(0);
    18. System.out.println("------- 撤销 ---------");
    19. remoteControl.undoButtonPushed(0);
    20. System.out.println("=================== 操作电视相关指令 =======================");
    21. // 设置电视的相关指令
    22. TV tv = new TV();
    23. Command tvOnCommand = new TVOnCommand(tv);
    24. Command tvOffCommand = new TVOffCommand(tv);
    25. // 将电视的命令,绑定到遥控器上
    26. remoteControl.setCommand(1, tvOnCommand, tvOffCommand);
    27. //操作 电视
    28. System.out.println("------- 打开 ---------");
    29. remoteControl.onButtonPushed(1);
    30. System.out.println("------- 关闭 ---------");
    31. remoteControl.offButtonPushed(1);
    32. System.out.println("------- 撤销 ---------");
    33. remoteControl.undoButtonPushed(1);
    34. }
    35. }

    输出如下:

    1. =================== 操作电灯相关指令 =======================
    2. ------- 打开 ---------
    3. 打开 电灯 ......
    4. ------- 关闭 ---------
    5. 关闭 电灯 ......
    6. ------- 撤销 ---------
    7. 打开 电灯 ......
    8. =================== 操作电视相关指令 =======================
    9. ------- 打开 ---------
    10. 打开 电视 ......
    11. ------- 关闭 ---------
    12. 关闭 电视 ......
    13. ------- 撤销 ---------
    14. 打开 电视 ......