设计模式之命令模式(行为型)--- 15

  • 一、导语
  • 二、怎么用
    1.样例背景
    2.UML类图
    3.代码示例
  • 三、优缺点
  • 四、使用场景
    1.概括描述
    2.现存知名产品中的使用示例
  • 五、相关设计模式
  • 六、参考

一、导语

命令模式(Command),将一个请求封装成一个对象,以便使用不同的请求。

命令模式解决了应用程序中对象的职责以及他们之间的通信方式。

命令模式的优点及使用原则

二、怎么用

共有2个示例,代码详见访问链接
下面以example2举例说明

1. 样例背景

模拟顾客去烧烤店吃烧烤的例子

2. UML类图

ACommand ---------------------------------- 抽象的命令类
BakeChickenWingCommand ------------------ 实际烤鸡翅的命令类
BakeMuttonCommand ------------------------ 实际烤羊肉串的命令类
Barbecuer ------------------------------------ 烧烤命令的直接执行者
Waiter ---------------------------------------- 点菜的服务员

example2 使用命令模式后 UML类图

3. 代码示例

/**
 * description:  命令模式的抽象类
 */
public abstract class ACommand {
    protected Barbecuer barbecuer;

    public ACommand(Barbecuer barbecuer) {
        this.barbecuer = barbecuer;
    }

    abstract void executeCommand();
}


/**
 * description:  烤鸡翅的具体命令
 */
public class BakeChickenWingCommand extends ACommand {
    public BakeChickenWingCommand(Barbecuer barbecuer) {
        super(barbecuer);
    }

    @Override
    void executeCommand() {
        barbecuer.bakeChickenWing();
    }
}


/**
 * description:  具体的烤羊肉串的类
 */
public class BakeMuttonCommand extends ACommand {
    public BakeMuttonCommand(Barbecuer barbecuer) {
        super(barbecuer);
    }

    @Override
    void executeCommand() {
        barbecuer.bakeMutton();
    }
}


/**
 * description:  烧烤师傅
 */
public class Barbecuer {
    public void bakeMutton(){
        System.out.println("烤羊肉串");
    }

    public void bakeChickenWing(){
        System.out.println("烤鸡翅");
    }
}


/**
 * description:  服务员类
 */
public class Waiter {
    private List commandList = new ArrayList<>();

    public void setOrder(ACommand command) {
        commandList.add(command);
    }

    public void cancelOrder(ACommand command) {
        commandList.remove(command);
    }

    public void executeAllCommand() {
        for (ACommand command : commandList) {
            command.executeCommand();
        }
        commandList.clear();
    }
}


public class Test {
    public static void main(String[] args) {
        Barbecuer barbecuer = new Barbecuer();
        ACommand bakeMuttonCommand1 = new BakeMuttonCommand(barbecuer);
        ACommand bakeMuttonCommand2 = new BakeMuttonCommand(barbecuer);
        ACommand bakeChickenWingCommand = new BakeChickenWingCommand(barbecuer);

        Waiter girl = new Waiter();
        girl.setOrder(bakeMuttonCommand1);
        girl.setOrder(bakeMuttonCommand2);
        girl.setOrder(bakeChickenWingCommand);

        girl.executeAllCommand();
    }
}

执行结果

烤羊肉串
烤羊肉串
烤鸡翅

三、优缺点

  • 缺点
    1.命令的无限扩展会增加类的数量,提高系统实现复杂度

  • 优点
    1.降低耦合
    2.容易扩展新命令或者一组命令

四、使用场景

1. 概括描述

  • 请求的调用者和请求的接收者需要解耦,使调用者和接收者不直接交互
  • 需要抽象出等待执行的行为

2. 现存知名产品中的使用示例 todo

2.1 Runnable (jdk)

2.2 junit.framework.Test (junit)

五、与其他设计模式的对比

1. 命令模式和备忘录模式

他们两个经常会结合起来使用,我们可以使用备忘录模式来保存命令的历史记录,
那这样的话就可以调取上一个命令,或者上上个命令,这些都是ok的。

六、参考

  1. https://coding.imooc.com/learn/list/270.html(强烈推荐)
  2. https://en.wikipedia.org/wiki/Design_Patterns
  3. 大话设计模式,电子版下载链接,https://pan.baidu.com/s/17WOI3Bvp-JUoQXvaomHISg 密码:vw05
    (作者博客,https://www.cnblogs.com/cj723/archive/2007/12/30/1021314.html)
  4. https://www.cnblogs.com/geek6/p/3951677.html

你可能感兴趣的:(设计模式之命令模式(行为型)--- 15)