命令模式(Command Pattern)是一种数据驱动的设计模式,它属于行为型模式。
命令模式将一个请求封装为一个对象,从而使你可以用不同的请求对客户进行参数化,对请求排队或记录请求日志,以及支持可撤销的操作。
点菜清单
/**
* 命令模式 - 订单类
* @version 0.1
* @author BaiJing.biz
*/
public class Order {
// 台号
private String tableId;
// 菜品和菜份
private Map<String,Integer> dishesAndNum = new HashMap<String,Integer>();
public String getTableId() {
return tableId;
}
public void setTableId(String tableId) {
this.tableId = tableId;
}
public Map<String, Integer> getDishesAndNum() {
return dishesAndNum;
}
// 调整为下面的 setDishesList
public void setDishesAndNum(Map<String, Integer> dishesAndNum) {
this.dishesAndNum = dishesAndNum;
}
// 设置点菜列表的菜品和数量
public void setDishesList(String dishesName,int num){
dishesAndNum.put(dishesName,num);
}
}
厨师
/**
* 命令模式 - 厨师
* @version 0.1
* @author BaiJing.biz
*/
public class Cook {
public void makeCook(String dishesName,int num) {
System.out.println(dishesName + " 菜品 -- " + num + "份。");
}
}
服务员
/**
* 命令模式 - 调用者:服务员
* @version 0.1
* @author BaiJing.biz
*/
public class Waiter {
// 命令对象
private List<Command> commands = new ArrayList<Command>();
// 设置命令到 List
public void setCommand(Command command){
commands.add(command);
}
// 发起
public void sayOrder() {
System.out.println("服务员 Say: 新订单来了 !");
for (Command command : commands) {
if (command != null) {
command.doDishes();
}
}
}
}
命令
/**
* 命令模式 - 抽象命令类
* @version 0.1
* @author BaiJing.biz
*/
public interface Command {
void doDishes();
}
/**
* 命令模式 - 实例命令类
* @version 0.1
* @author BaiJing.biz
*/
public class OrderCommand implements Command {
// 接受者对象 (receiver)
private Cook cook;
// 订单
private Order order;
public OrderCommand(Order order, Cook cook) {
this.order = order;
this.cook = cook;
}
@Override
public void doDishes() {
System.out.println(order.getTableId() + " 桌,订单: ");
Map<String, Integer> dishesList = order.getDishesAndNum();
// 展示菜单列表
Set<String> keys = dishesList.keySet();
for (String dishesName : keys) {
cook.makeCook(dishesName, dishesList.get(dishesName));
}
System.out.println(order.getTableId() + "桌菜品已经准备完成。上菜。");
}
}
客户
public class CustomerRun {
public static void main(String[] args) {
// 订单
Order o1 = new Order();
Order o2 = new Order();
// 初始化 菜单list
o1.setTableId("01");
o1.setDishesList("薄荷牛肉",1);
o1.setDishesList("清汤面",1);
o1.setDishesList("凉啤酒",2);
o2.setTableId("02");
o2.setDishesList("川味烤鱼",1);
o2.setDishesList("米饭",3);
o2.setDishesList("热米酒",3);
// 厨师
Cook cook = new Cook();
OrderCommand c1 = new OrderCommand(o1,cook);
OrderCommand c2 = new OrderCommand(o2,cook);
// 服务员
Waiter waiter = new Waiter();
waiter.setCommand(c1);
waiter.setCommand(c2);
// 服务员对厨师发命令
waiter.sayOrder();
}
}
结果


之命令模式(Command Pattern)&spm=1001.2101.3001.5002&articleId=150397609&d=1&t=3&u=cee26e62c9554f508769dd60d5587cb9)
736

被折叠的 条评论
为什么被折叠?



