[Design Patterns] 设计模式(六) 命令模式
前言
在日常生活中,我们经常会遇到过这样的场景:去餐厅点餐时,只需要将菜单交给服务员,稍等片刻后就可以吃到想吃的食物了,整个过程中我们跟制作食物的厨师没有一丝的交流。这个场景放在程序中,可以说将客户和厨师进行了完全解耦,而这个场景的实现方式,就是本篇文章的主角——命令模式。
定义
命令模式可以将动作的请求者和动作的执行者进行解耦。它将命令(或请求)封装成对象,以便使用不同的请求、队列、或者日志来参数化其他对象。命令模式支持撤销操作。
使用场景
- 1.执行队列请求:将命令对象添加到队列中,逐个进行处理(如餐厅点餐时,厨师一个一个解决订单)。
- 2.日志请求:可以在命令对象中添加store()、restore()方法来存储/恢复调用过的命令记录。
UML类图
示例
这里就以餐厅点餐为例,通过命令模式实现该功能:
首先定义抽象命令接口和具体命令类:
//命令接口
public interface IOrder {
void execute();
void undo();
}
//火锅订单
public class HotpotOrder implements IOrder {
@Override
public void execute() {
// TODO Auto-generated method stub
System.out.println("火锅开始搞起来。。。。");
}
@Override
public void undo() {
// TODO Auto-generated method stub
System.out.println("火锅取消。。。。");
}
}
//川菜订单
public class ChuancaiOrder implements IOrder {
@Override
public void execute() {
// TODO Auto-generated method stub
System.out.println("川菜开始搞起来。。。。");
}
@Override
public void undo() {
// TODO Auto-generated method stub
System.out.println("川菜取消。。。。");
}
}
然后定义一个命令的传送者(或者控制者)——服务员类:
public class Waiter {
private IOrder order;
private Chief chief = new Chief();
public void setOrder(IOrder r) {
this.order = r;
chief.takeOrder(r);
}
}
接下来定义命令接受者——厨师类:
public class Chief {
public void takeOrder(IOrder r) {
r.execute();
}
}
最后,定义一个顾客,并开始点餐:
public class Client {
public static void main(String[] args) {
// TODO Auto-generated method stub
Waiter waiter = new Waiter();
IOrder order = new HotpotOrder();
waiter.setOrder(order);
order = new ChuancaiOrder();
waiter.setOrder(order);
}
}
/**
火锅开始搞起来。。。。
川菜开始搞起来。。。。
*/
总结
- 1.命令模式是一种结构型设计模式;
- 2.命令模式将命令封装成为了一个对象,将命令发出者和执行者之间进行解耦;
- 3.命令支持撤销操作。