版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/a770794164/article/details/90727267
命令模式(Commond),将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可撤销的操作。
举例:
当晚上出去吃烧烤时,如果每个顾客都直接给厨师说需要什么,要不要放什么调料之类的,厨师很容易记混乱,而且很容易弄错上菜的先后顺序。采用命令模式,就是增加一个服务员,按顺序专门记录每个顾客的需求,然后按顺序让厨师去做。
代码如下:
- 厨师类
class Chef {
public void makeBeaf(){
System.out.println("烤牛排");
}
public void makeChickenWing(){
System.out.println("烤鸡翅");
}
}
- 命令抽象类及其实现类
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();
}
}
- 服务员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();
}
}
}
- 主程序
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();
}
}
结果:
=== 开始下单 ===
服务员: 没有烤牛排了!
服务员: 增加烤鸡翅!
服务员: 增加烤鸡翅!
服务员: 增加烤鸡翅!
服务员: 增加烤鸡翅!
=== 去掉一个鸡翅 ===
服务员: 去掉点的这个菜!
=== 提交订单,开始制作 ===
烤鸡翅
烤鸡翅
烤鸡翅
命令模式的好处:
- 它能较容易地设计一个命令队列
- 在需要的情况下,可以较容易地将命令记入日志
- 允许接收请求的一方决定是否要否决请求
- 可以容易地实现对请求的撤销和重做
- 由于加进新的具体命令类不影响其他的类,因此增加新的命令类很容易
- 命令模式把请求一个操作与知道怎么执行一个操作的对象分隔开
Command命令模式是一种对象行为型模式,它主要解决的问题是:在软件构建过程中,“行为请求者”与“行为实现者”通常呈现一种“紧耦合”的问题。
GoF《设计模式》中说道:将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可撤销的操作。