设计模式学习(十一)命令模式

介绍

命令模式(Command Pattern)是一种数据驱动的设计模式,它属于行为型模式。请求以命令的形式包裹在对象中,并传给调用对象。调用对象寻找可以处理该命令的合适的对象,并把该命令传给相应的对象,该对象执行命令。

类图说明

在这里插入图片描述

假设一个场景,老板跟经理沟通说,我想要制造宝马X6和宝马X7,制造出来后,需要把它卖掉。那么我们可以将老板的需求理解为两个命令,第一个命令制造宝马车,第二个命令出售宝马车。ok,那么应用到命令模式里边,就可以设计为四层,最底层实际干活的,也就是真正制造宝马X6和X7的,所以定义了一个接口和两个实现类。往上一层就是命令封装层,该层核心的一个方法execute()方法,需要具体实现每个命令实际做的事情,而我们场景中分别为SellCom和BuilderCommand两个命令,分别调用宝马X6和X7两个对象干对应的活,再网上一层定义类似经理的角色Invoker,接收老板的命令,最上层老板想好自己命令告知经理执行。

代码示例

文件结构如下:
在这里插入图片描述
代码示例如下:

public interface BMW {
    
    
    void builder();

    void sell();
}
public class BMWX6 implements BMW {
    
    
    @Override
    public void builder() {
    
    
        System.out.println("BMWX6已制造");
    }

    @Override
    public void sell() {
    
    
        System.out.println("BMWX6已出售");
    }
}
public class BMWX7 implements BMW {
    
    
    @Override
    public void builder() {
    
    
        System.out.println("BMWX7已制造");
    }

    @Override
    public void sell() {
    
    
        System.out.println("BMWX7已出售");
    }
}
public abstract class Command {
    
    
    protected BMWX6 bmwx6 = new BMWX6();
    protected BMWX7 bmwx7 = new BMWX7();

    public abstract void execute();
}
public class BuilderCommand extends Command {
    
    
    @Override
    public void execute() {
    
    
        super.bmwx6.builder();
        super.bmwx7.builder();
    }
}
public class SellCommand extends Command {
    
    
    @Override
    public void execute() {
    
    
        super.bmwx6.sell();
        super.bmwx7.sell();
    }
}

public class Invoker {
    
    
    private Command command;

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

    public void action(){
    
    
        this.command.execute();
    }
}
public class CommandPattern {
    
    
    public static void main(String[] args) {
    
    
        BuilderCommand builderCommand = new BuilderCommand();
        SellCommand sellCommand = new SellCommand();

        Invoker invoker = new Invoker();
        invoker.setCommand(builderCommand);
        invoker.action();

        invoker.setCommand(sellCommand);
        invoker.action();
    }
}

运行结果如下:
在这里插入图片描述

应用场景

认为是命令的地方都可以使用命令模式,比如:

  • GUI 中每一个按钮都是一条命令
  • 模拟 CMD

优缺点

优点

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

缺点

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

Guess you like

Origin blog.csdn.net/he_cha_bu/article/details/114792494