定义
命令模式是一种对象行为型模式,命令模式将一个请求封装成一个对象,从而使我们可以用不同的请求对客户进行参数化,使发送者和接收者完全解耦。
发送者和接收者之间没有直接引用关系,发送请求的对象只需知道如何发送请求,而不必知道如何执行。
角色
Command:抽象命令类
ConcreteCommand:具体命令类
Invoker:调用者(命令发出者)
Receiver:接收者(执行者)
Client:客户类
实例
下面用命令模式模拟饮品店订单流程
package command;
/*
* 订单对象
*/
import java.util.HashMap;
public class Order {
private int id;
private HashMap<String,Integer>fruitmap;
public Order() {
//水果名称,数量
fruitmap=new HashMap<String,Integer>();
}
public int getId() {
// TODO Auto-generated method stub
return id;
}
public HashMap<String, Integer> getFruitmap() {
return fruitmap;
}
public void setFruitmap(String fruitkind,int quantity) {
this.fruitmap.put(fruitkind, quantity);
}
public void setId(int id) {
this.id = id;
}
}
package command;
/*
* 具体操作
*/
public class Operator {
//榨汁员工
public void MarkFruit(Order order) {
// TODO Auto-generated method stub
String str="";
for(String key:order.getFruitmap().keySet()) {
str+=key+order.getFruitmap().get(key);
}
System.out.println("黑暗混合果汁:"+str);
}
}
package command;
/*
* 抽象命令类
*/
public interface Command {
void execute();
}
package command;
/*
* 具体命令类
* 封装的命令对象
*/
public class OrderCommand implements Command {
private Operator receiver;//榨汁员工:接收者
private Order order;
public OrderCommand(Operator receiver,Order order) {
this.receiver=receiver;
this.order=order;
}
@Override
public void execute() {
// TODO Auto-generated method stub
System.out.println(order.getId()+"号顾客的成品");
receiver.MarkFruit(order);
}
}
package command;
/**
* 调度者(前台服务员)
*/
import java.util.ArrayList;
public class WaitorInvoker {
private ArrayList<Command>commands=null;
public WaitorInvoker() {
commands=new ArrayList<Command>();
}
public void setCommand(Command cmd) {
commands.add(cmd);
}
public void OrderUp() {
System.out.println("新的订单!");
for(Command cmd:commands) {//发送命令
if(cmd!=null)
cmd.execute();
}
}
}
package command;
public class ClientClass {
public static void main(String args[])
{
//创建多个订单
Order order1=new Order();
order1.setId(1);
order1.setFruitmap("橙子", 1);
order1.setFruitmap("梨子", 2);
order1.setFruitmap("苹果", 3);
Order order2=new Order();
order2.setId(2);
order2.setFruitmap("香蕉", 1);
order2.setFruitmap("葡萄", 2);
order2.setFruitmap("西瓜", 3);
//创建操作者
Operator op=new Operator();
//将多个订单封装成命令对象
OrderCommand cmd1=new OrderCommand(op,order1);
OrderCommand cmd2=new OrderCommand(op,order2);
//创建调用者并发出命令
WaitorInvoker waitor=new WaitorInvoker();
waitor.setCommand(cmd1);
waitor.setCommand(cmd2);
//执行命令
waitor.OrderUp();
}
}
运行结果:

学习视频指路:黑手书生
https://search.bilibili.com/all?keyword=%E9%BB%91%E6%89%8B%E4%B9%A6%E7%94%9F&from_source=nav_search_new
655

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



