简单梳理命令模式
命令模式的实现
我们出去吃烧烤时,通常进店,需要将自己想点得告知服务员即可,
剩下得就是等待服务员通知厨师,然后我们等着烤好开吃就行了,
通常我们是不关心厨师怎么烤得,以及有没有我们点得食材。
我们来看下这种生活场景如何用设计模式来实现。
抽象类或接口 用来传输命令
public abstract class Command {
protected Barbecure receiver;
public Command(Barbecure receiver) {
this.receiver = receiver;
}
public abstract void ExecuteCommand();
}
烧烤类
public class Barbecure {
public void BakeMutton(){
System.out.println("烤羊肉串儿");
}
public void BakeChickenWing(){
System.out.println("烤鸡翅");
}
}
public class BakeMuttonCommand extends Command{
public BakeMuttonCommand(Barbecure receiver) {
super(receiver);
}
@Override
public void ExecuteCommand() {
receiver.BakeMutton();
}
}
public class BakeChickenWingCommand extends Command{
public BakeChickenWingCommand(Barbecure receiver) {
super(receiver);
}
@Override
public void ExecuteCommand() {
receiver.BakeChickenWing();
}
}
服务员类
public class Waiter {
private List<Command> orders = new ArrayList<>();
public void SetOrder(Command command){
if(command.toString().contains("BakeChickenWingCommand")){
System.out.println("鸡翅没有了,请点别的烧烤");
}else{
orders.add(command);
System.out.println("新增订单:"+command.toString()+",时间:"+ LocalDateTime.now());
}
}
public void CancleOrder(Command command){
orders.remove(command);
System.out.println("取消订单:"+command.toString()+",时间:"+ LocalDateTime.now());
}
//通知全部执行
public void Notify(){
for(Command cmd : orders){
cmd.ExecuteCommand();
}
}
}
这样我们前期的定义就算做完了,
然后我们看具体应用中的使用。
定义业务方法
看在具体业务逻辑中如何使用
public class CommandTest {
public static void main(String[] args) {
//命令模式
func1();
}
public static void func1(){
Barbecure boy = new Barbecure();
Command bakeMuttonCommand1 = new BakeMuttonCommand(boy);
Command bakeMuttonCommand2 = new BakeMuttonCommand(boy);
Command bakeChickenWingCommand = new BakeChickenWingCommand(boy);
Waiter girl = new Waiter();
girl.SetOrder(bakeMuttonCommand1);
girl.SetOrder(bakeMuttonCommand2);
girl.SetOrder(bakeChickenWingCommand);
girl.Notify();
}
}
执行结果
新增订单:designpattem.command.BakeMuttonCommand@6d6f6e28,时间:2022-12-12T09:17:48.427
新增订单:designpattem.command.BakeMuttonCommand@6d03e736,时间:2022-12-12T09:17:48.428
鸡翅没有了,请点别的烧烤
烤羊肉串儿
烤羊肉串儿
结果分析
命令模式,将一个请求封装成对象,从而使你可以用不同得请求对客户进行参数化;
对请求排队或记录请求日志,以及支持可撤销得操作。
那命令模式得有点有哪些呢?
一:能较容易得设计一个命令队列;
二:在需要得时候,可以很方便得将命令记入日志;
三:允许接受请求得一方设置是否要否决请求;
四:可以很容易得实现对请求得撤销和重做;
五:新增新的命令类很容易;
联系作者
微信公众号
xiaomingxiaola
(BossLiu)
QQ群
58726094
转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 384276224@qq.com