首页 > 其他 > 详细

第六式 命令模式

时间:2019-05-11 19:15:57      阅读:182      评论:0      收藏:0      [点我收藏+]

命令模式

 经营烧烤的两种模式

  很多人都喜欢吃烧烤,尤其是东北人民,在东北没有什么是一顿烧烤解决不了的,如果有那就两顿。咳咳,开个玩笑。现在,在对象城吃货街有一个烧烤摊,经营的是一个烧烤师傅,他烧烤的手艺很好周围有一群吃货围着,大家七嘴八舌的点着餐。忽然,发生了争吵,原来是小明很久之前就点了5串羊肉,2串面筋,但是师傅却把刚刚烤好的羊肉给了旁边刚来的小王,小明很不开心的跟师傅理论起来了,但是师傅实在太忙,已经是手忙脚乱了。一边烧烤,一边听吃客点菜,一边还得收钱,根本忙不过来,且记不住。离烧烤摊点不远处,有一个龙哥烧烤店,他们家来了食客后,服务员都会递一份菜单给食客,然后食客点完菜之后,再告诉服务员,服务员再把订单交给厨房里的大师傅,当某种食材售罄时,还会提醒食客取消或替换,食客在等待的过程中,如果想减少某样菜的数量告知服务员一声即可。这两种经营模式,显然是第二种更加的高效且不易犯错,服务员起到了隔绝食客直接调用师傅的过程,让师傅只专注于自己核心的烧烤业务。前者为灵活性很差的紧耦合设计,后者为更灵活的松耦合设计。

  类图如下:

  技术分享图片

  

   技术分享图片

 

 

 什么是命令模式?

  将“请求”封装成对象,以便使用不同的请求、队列或者日志来参数化其他对象。命令模式也支持可撤销的操作。

   技术分享图片

 

 代码

  Command类,用来执行操作的,可以抽象类也可以是接口

public abstract class Command {
    Receiver receiver;

    public Command(Receiver receiver){
        this.receiver = receiver;
    }

    public abstract void execute();
}

 

   ConcreteCommand类,将一个接收者对象绑定于一个动作,调用接收者相应的操作,以实现execute

public class ConcreteCommand extends Command {

    public ConcreteCommand(Receiver receiver) {
        super(receiver);
    }

    public void execute() {
        receiver.action();
    }
}

   Invoker类,要求该命令执行这个请求

public class Invoker {
    private Command command;

    public void setCommand(Command command) {
        this.command = command;
    }

    public void executeCommand(){
        command.execute();
    }
}

   Receiver类,知道如何实施与执行一个请求相关的操作,任何类都可能成为一个接收者

public class Receiver {
    public void action(){
        System.out.println("执行请求");
    }
}

   创建一个具体的命令对象,并设定它的接收者。

public static void main(String[] args){
        Receiver r = new Receiver();
        Command c = new ConcreteCommand(r);
        Invoker i = new Invoker();
        i.setCommand(c);
        i.executeCommand();
    }

 

 总结

  1. 命令模式可以容易的地设计一个命令队列
  2. 在需要的情况下,可以很容易的将命令记入日志
  3. 允许接受请求的一方决定是否要否决请求
  4. 可以实现对请求的撤销和重做
  5. 由于加进新的具体命令类不影响其他的类吗,因此增加新的具体命令类很容易
  6. 命令模式将请求一个操作对象和知道怎么执行一个操作对象分割开,实现了解耦。这是最重要的一点

 

第六式 命令模式

原文:https://www.cnblogs.com/bwyhhx2018/p/10849519.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!