调用者发送一个请求,接收者执行请求来实现具体逻辑。 为了解耦,我们将请求封装成一个命令对象。请求者只需要调用命令即可,无需关心调用接收者的哪一个方法 如何实现! 这样,请求者可以同时调用多个命令。
角色:
抽象命令类(Command):声明执行命令的接口,拥有执行命令的抽象方法 execute()。
具体命令类(Concrete Command):抽象命令类的具体实现类,拥有接收者对象,调用接收者的功能来完成具体操作。
接收者(Receiver):命令对象会绑定并调用它来执行具体逻辑。
调用者(Invoker):调用命令对象的execute()。
例子:客户去餐馆吃早餐,早餐分为很多,如河粉和馄饨等。 服务员收集到订单后,一起提交给厨师,厨师来具体实现。 对于服务员,并不关心如何实现。 用命令模式:
抽象命令类: 制作早餐的命令
具体命令类: 河粉、 馄饨
接收者:厨师
调用者: 服务员
接收者:厨师,他知道具体的制作逻辑
/**
* 早餐制作
*/
public interface BreakFastCooker {
/**
* 制作早餐
*/
void cooking();
}
/**
* 制作馄饨
*/
public class HunTunCooker implements BreakFastCooker {
@Override
public void cooking() {
System.out.println("现在开始炒馄饨了");
}
}
/**
* 制作河粉
*/
public class HefenCooker implements BreakFastCooker {
@Override
public void cooking() {
System.out.println("现在开始炒河粉了");
}
}
这时,假如由调用者(服务员)直接找每个接收者(厨师)去制作,耦合性很高,服务员必须知道调用哪个厨师的哪个方法。 这时为了解耦,将早餐制作封装为命令对象,服务员只需要调用命令对象的execute();
/**
* 制作早餐的命令
*/
public interface Command {
/**
* 制作早餐
*/
void execute();
}
/**
* 制作河粉的命令
*/
public class HeFenCommand implements Command{
private HefenCooker hefenCooker;
public HeFenCommand(){
this.hefenCooker = new HefenCooker();
}
@Override
public void execute() {
hefenCooker.cooking();
}
}
/**
* 制作馄饨的命令
*/
public class HunTunCommand implements Command{
private HunTunCooker hunTunCooker;
public HunTunCommand(){
this.hunTunCooker = new HunTunCooker();
}
@Override
public void execute() {
hunTunCooker.cooking();
}
}
此时,调用者只需创建不同的订单命令,执行命令即可。
/**
* 服务员:调用者
*/
public class Waiter {
private List<Command> commandList;
public Waiter(){
commandList = new ArrayList<>();
}
/**
* 创建订单
* @param command
*/
public void createOrder(Command command){
commandList.add(command);
}
/**
* 提交订单
*/
public void submitOrders(){
for (Command command : commandList) {
command.execute();
}
}
}
测试:
/**
* 测试类
*/
public class TestDesign {
public static void main(String[] args) {
//调用者:服务员
Waiter waiter = new Waiter();
//客人点河粉,服务员创建订单
Command heFenCommand = new HeFenCommand();
waiter.createOrder(heFenCommand);
//客人点馄饨,服务员创建订单
Command hunTunCommand = new HunTunCommand();
waiter.createOrder(hunTunCommand);
//服务员提交订单
waiter.submitOrders();
}
}
本文通过实例介绍了命令模式在餐饮场景中的应用,服务员作为调用者,厨师作为接收者。命令模式将制作早餐的动作封装为命令对象,降低了服务员与厨师之间的耦合,使得服务员只需调用命令对象执行即可,无需关心具体制作细节。具体命令类包括河粉和馄饨制作命令,厨师根据命令执行相应操作。
1316

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



