命令模式

让程序通畅运行-命令模式

模式简介

定义:将一个请求封装成一个对象,从而让用户使用不同的请求把客户端参数化:对请求排队或者记录请求日志,以及支持可撤销操作

使用场景

  • 需要抽象出等待执行的动作,然后以参数的形式提供出来–类似于过程设计中的回调机制,而命令模式正是回调机制的一个面向对象的替代品。
  • 在不同的时刻指定、排列和执行请求。一个命令对象可以有与出事请求无关的生存期。
  • 需要支持取消操作
  • 支持修改日志功能,这样当系统崩溃时,这些修改可以被重做一遍
  • 需要支持事务操作

简单实现

接收者角色 俄罗斯方块游戏

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
package CommandMode;
 
public class TetrisMachine {
    public void toLeft(){
        System.out.println("向左");
    }
 
    public void toRight(){
        System.out.println("向右");
    }
 
    public void fastToBottom(){
        System.out.println("快速落下");
    }
 
    public void transfrom(){
        System.out.println("改变形状");
    }
 
}

命令者抽象 定义执行方法

1
2
3
4
5
package CommandMode;
 
public interface Command {
    void execute();
}

具体命令者 向左移命令

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
package CommandMode;
 
public class LeftCommand implements Command {
    private TetrisMachine tetrisMachine;
    public LeftCommand(TetrisMachine tetrisMachine){
        this.tetrisMachine=tetrisMachine;
    }
 
    public void execute() {
        tetrisMachine.toLeft();
    }
}

具体命令者 向右移命令

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
package CommandMode;
 
public class RightCommand implements Command {
    private TetrisMachine tetrisMachine;
 
    public RightCommand(TetrisMachine tetrisMachine) {
        this.tetrisMachine = tetrisMachine;
    }
 
    public void execute() {
        tetrisMachine.toRight();
    }
}

**具体命令者 快速落下的命令类

**

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
package CommandMode;
 
public class FallCommand implements Command {
    private TetrisMachine machine;
 
    public FallCommand(TetrisMachine machine) {
        this.machine = machine;
    }
 
    public void execute() {
        machine.fastToBottom();
    }
}

测试类

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
package CommandMode;
 
public class Client {
    public static void main(String[] args) {
        TetrisMachine tetrisMachine=new TetrisMachine();
 
        LeftCommand leftCommand=new LeftCommand(tetrisMachine);
        RightCommand rightCommand=new RightCommand(tetrisMachine);
        FallCommand fallCommand=new FallCommand(tetrisMachine);
        TransfromCommand transfromCommand=new TransfromCommand(tetrisMachine);
 
        Buttons buttons=new Buttons();
        buttons.setLeftCommand(leftCommand);
        buttons.setRightCommand(rightCommand);
        buttons.setTransfromCommand(transfromCommand);
        buttons.setFallCommand(fallCommand);
 
        buttons.fall();
        buttons.toLeft();
        buttons.toRight();
        buttons.transfrom();
 
    }
}

执行结果

CommandMode.png

总结

​ 命令模式中充分体现了几乎所有设计模式的通病,就是类的膨胀,大量衍生类的创建,这是一个不可避免的问题,但是,它给我们带来的好处也非常多,更弱的耦合性、更灵活的控制性以及更好的拓展性,不过,在实际开发过成功是不是需要采用命令模式还是需要斟酌