Java大话设计模式学习总结(二十三)---命令模式

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/a770794164/article/details/90727267

命令模式(Commond),将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可撤销的操作。
来自大话设计模式
举例:
当晚上出去吃烧烤时,如果每个顾客都直接给厨师说需要什么,要不要放什么调料之类的,厨师很容易记混乱,而且很容易弄错上菜的先后顺序。采用命令模式,就是增加一个服务员,按顺序专门记录每个顾客的需求,然后按顺序让厨师去做。

代码如下:

  1. 厨师类
class Chef {
    public void makeBeaf(){
        System.out.println("烤牛排");
    }
    public void makeChickenWing(){
        System.out.println("烤鸡翅");
    }
}
  1. 命令抽象类及其实现类
abstract class Commond {
    Chef chef;
    public Commond(Chef chef) {
        this.chef = chef;
    }
    abstract void excute();
}

class MakeBeafCommond extends Commond {
    public MakeBeafCommond(Chef chef) {
        super(chef);
    }
    @Override
    void excute() {
        chef.makeBeaf();
    }
}

class MakeChickenWingCommond extends Commond {
    public MakeChickenWingCommond(Chef chef) {
        super(chef);
    }
    @Override
    void excute() {
        chef.makeChickenWing();
    }
}
  1. 服务员invoker类
class Waiter {
    private List<Commond> commonds = new ArrayList<>();
    
    void setOrder(Commond commond){
        if (commond instanceof MakeBeafCommond) {
            System.out.println("服务员: 没有烤牛排了!");
        } else {
            commonds.add(commond);
            System.out.println("服务员: 增加烤鸡翅!");
        }
    }
    
    void delOrder(Commond commond){
        System.out.println("服务员: 去掉点的这个菜!");
        commonds.remove(commond);
    }
    
    void excute(){
        for (Commond commond : commonds) {
            commond.excute();
        }
    }
}
  1. 主程序
class Test {
    public static void main(String[] args) {
        Waiter waiter = new Waiter();
        Chef chef = new Chef();
        Commond beaf1 = new MakeBeafCommond(chef);
        Commond chick1 = new MakeChickenWingCommond(chef);
        Commond chick2 = new MakeChickenWingCommond(chef);
        Commond chick3 = new MakeChickenWingCommond(chef);
        Commond chick4 = new MakeChickenWingCommond(chef);
        System.out.println("=== 开始下单 ===");
        waiter.setOrder(beaf1);
        waiter.setOrder(chick1);
        waiter.setOrder(chick2);
        waiter.setOrder(chick3);
        waiter.setOrder(chick4);
        System.out.println("=== 去掉一个鸡翅 ===");
        waiter.delOrder(chick3);
        System.out.println("=== 提交订单,开始制作 ===");
        waiter.excute();
    }
}
结果:
=== 开始下单 ===
服务员: 没有烤牛排了!
服务员: 增加烤鸡翅!
服务员: 增加烤鸡翅!
服务员: 增加烤鸡翅!
服务员: 增加烤鸡翅!
=== 去掉一个鸡翅 ===
服务员: 去掉点的这个菜!
=== 提交订单,开始制作 ===
烤鸡翅
烤鸡翅
烤鸡翅

命令模式的好处:

  1. 它能较容易地设计一个命令队列
  2. 在需要的情况下,可以较容易地将命令记入日志
  3. 允许接收请求的一方决定是否要否决请求
  4. 可以容易地实现对请求的撤销和重做
  5. 由于加进新的具体命令类不影响其他的类,因此增加新的命令类很容易
  6. 命令模式把请求一个操作与知道怎么执行一个操作的对象分隔开

Command命令模式是一种对象行为型模式,它主要解决的问题是:在软件构建过程中,“行为请求者”与“行为实现者”通常呈现一种“紧耦合”的问题。
GoF《设计模式》中说道:将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可撤销的操作。

猜你喜欢

转载自blog.csdn.net/a770794164/article/details/90727267