命令模式(Command Pattern)是对命令的封装,每一个命令都是一个操作:请求方发出请求要求执行一个操作;接收方收到请求,并执行操作。命令模式解耦了请求方和接收方(通过ICommand),请求方只需请求执行命令,不用关心命令怎样被接收、怎样被操作及是否被执行等。命令模式属于行为型设计模式

    image.png
    在策略模式的基础上,把命令的执行者与请求者解耦
    Receiver是具体的命令执行者,多数情况下无法抽象,如果能实现抽象相当于Commond和Receiver使用了桥接模式

    1. public interface ICommand {
    2. void execute();
    3. }
    4. public class ConcreteCommand implements ICommand {
    5. private Receiver receiver;
    6. public ConcreteCommand(Receiver receiver) {
    7. this.receiver = receiver;
    8. }
    9. @Override
    10. public void execute() {
    11. this.receiver.action();
    12. }
    13. }
    14. public class Receiver {
    15. public void action(){
    16. }
    17. }
    18. public class Invoker {
    19. private ICommand command;
    20. public Invoker(ICommand command) {
    21. this.command = command;
    22. }
    23. public void actiion(){
    24. this.command.execute();
    25. }
    26. }
    27. public class Client {
    28. public static void main(String[] args){
    29. Receiver receiver = new Receiver();
    30. Invoker invoker = new Invoker(new ConcreteCommand(receiver));
    31. invoker.actiion();
    32. }
    33. }

    框架
    JDK的Runnable接口,相当于抽象命令,调用start

    优点

    • 解耦命令请求与处理
    • 命令易于扩展,符合开闭原则
    • 支持组合命令

    缺点

    • 类膨胀