设计模式之命令模式

  1. 简单梳理命令模式
    1. 命令模式的实现
      1. 定义业务方法
      2. 执行结果
      3. 结果分析
  2. 联系作者
    1. 微信公众号
    2. QQ群

简单梳理命令模式

命令模式的实现

我们出去吃烧烤时,通常进店,需要将自己想点得告知服务员即可,
剩下得就是等待服务员通知厨师,然后我们等着烤好开吃就行了,
通常我们是不关心厨师怎么烤得,以及有没有我们点得食材。

我们来看下这种生活场景如何用设计模式来实现。

抽象类或接口 用来传输命令

public abstract class Command {
    protected Barbecure receiver;

    public Command(Barbecure receiver) {
        this.receiver = receiver;
    }

    public abstract void ExecuteCommand();
}

烧烤类

public class Barbecure {
    public void BakeMutton(){
        System.out.println("烤羊肉串儿");
    }
    public void BakeChickenWing(){
        System.out.println("烤鸡翅");
    }
}
public class BakeMuttonCommand extends Command{
    public BakeMuttonCommand(Barbecure receiver) {
        super(receiver);
    }

    @Override
    public void ExecuteCommand() {
        receiver.BakeMutton();
    }
}
public class BakeChickenWingCommand extends Command{
    public BakeChickenWingCommand(Barbecure receiver) {
        super(receiver);
    }

    @Override
    public void ExecuteCommand() {
        receiver.BakeChickenWing();
    }
}

服务员类

public class Waiter {
    private List<Command> orders = new ArrayList<>();

    public void SetOrder(Command command){
        if(command.toString().contains("BakeChickenWingCommand")){
            System.out.println("鸡翅没有了,请点别的烧烤");
        }else{
            orders.add(command);
            System.out.println("新增订单:"+command.toString()+",时间:"+ LocalDateTime.now());
        }
    }

    public void CancleOrder(Command command){
        orders.remove(command);
        System.out.println("取消订单:"+command.toString()+",时间:"+ LocalDateTime.now());
    }

    //通知全部执行
    public void Notify(){
        for(Command cmd : orders){
            cmd.ExecuteCommand();
        }
    }
}

这样我们前期的定义就算做完了,
然后我们看具体应用中的使用。

定义业务方法

看在具体业务逻辑中如何使用

public class CommandTest {
    public static void main(String[] args) {
        //命令模式
        func1();
    }

    public static void func1(){
        Barbecure boy = new Barbecure();
        Command bakeMuttonCommand1 = new BakeMuttonCommand(boy);
        Command bakeMuttonCommand2 = new BakeMuttonCommand(boy);
        Command bakeChickenWingCommand = new BakeChickenWingCommand(boy);

        Waiter girl = new Waiter();

        girl.SetOrder(bakeMuttonCommand1);
        girl.SetOrder(bakeMuttonCommand2);
        girl.SetOrder(bakeChickenWingCommand);

        girl.Notify();
    }
}

执行结果

新增订单:designpattem.command.BakeMuttonCommand@6d6f6e28,时间:2022-12-12T09:17:48.427
新增订单:designpattem.command.BakeMuttonCommand@6d03e736,时间:2022-12-12T09:17:48.428
鸡翅没有了,请点别的烧烤
烤羊肉串儿
烤羊肉串儿

结果分析

命令模式,将一个请求封装成对象,从而使你可以用不同得请求对客户进行参数化;
对请求排队或记录请求日志,以及支持可撤销得操作。

那命令模式得有点有哪些呢?
一:能较容易得设计一个命令队列;
二:在需要得时候,可以很方便得将命令记入日志;
三:允许接受请求得一方设置是否要否决请求;
四:可以很容易得实现对请求得撤销和重做;
五:新增新的命令类很容易;

联系作者

微信公众号

xiaomingxiaola
(BossLiu)

QQ群

58726094


转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 384276224@qq.com

×

喜欢就点赞,疼爱就打赏

日记本 网文世界