zoukankan      html  css  js  c++  java
  • Command

    命令模式:将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化;对请求排队或记录请求日记,以及支持可撤销的操作。

    命令模式把请求一个操作的对象与知道怎么执行一个操作的对象分割开。

    优点:
    1、它能较容易设计一个命令队列。
    2、需要的情况下,可以较容易地将命令记入日记。
    3、允许接收请求的一方决定是否要否决请求。
    4、可以容易地实现对请求的撤销和重做。
    5、由于加入新的具体命令类不影响其它类,所以增添新的命令类很容易。

    Command:用来声明执行的接口。

    Invoker(waiter):要求该命令执行这个请求。

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

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

     1 public class Barbecuer {
     2 
     3     public void bakeMutton(){
     4     System.out.println("烤羊肉");
     5     }
     6     
     7     public void bakeChickenWing(){
     8     System.out.println("烤鸡翅");
     9     }
    10     
    11 }
     1 //所有命令的接口
     2 public abstract class Command {
     3 
     4     protected Barbecuer receiver;
     5     
     6     public Command(Barbecuer receiver){
     7     this.receiver = receiver;
     8     }
     9     
    10     public abstract void excuteCommand();
    11     
    12 }
     1 //具体的命令
     2 class BakeMuttonCommand extends Command{
     3 
     4     public BakeMuttonCommand(Barbecuer receiver) {
     5     super(receiver);
     6     }
     7 
     8     @Override
     9     public void excuteCommand() {
    10     receiver.bakeMutton();
    11     }
    12 
    13     @Override
    14     public String toString() {
    15     return "命令模式.烤羊肉";
    16     }
    17     
    18 }
     1 class BakeChickenWingCommand extends Command{
     2 
     3     public BakeChickenWingCommand(Barbecuer receiver) {
     4     super(receiver);
     5     }
     6 
     7     @Override
     8     public void excuteCommand() {
     9     receiver.bakeChickenWing();
    10     }
    11     
    12     @Override
    13     public String toString() {
    14     return "命令模式.烤鸡翅";
    15     }
    16     
    17 }
     1 //服务员
     2 public class Waiter {
     3 
     4     private List<Command> orders = new ArrayList<Command>();
     5     
     6     public void setOrder(Command c){
     7     orders.add(c);
     8     //记录日记
     9     System.out.println("添加订单:"+c.toString());
    10     }
    11     
    12     public void book(){
    13     for(Command c : orders){
    14         c.excuteCommand();
    15     }
    16     }
    17     
    18     public void CancelOrder(Command c){
    19     orders.remove(c);
    20     //记录日记
    21     System.out.println("取消订单:"+c.toString());
    22     }
    23 }
     1     public static void main(String[] args) {
     2     
     3       Barbecuer barbecuer = new Barbecuer();
     4     
     5       Command bakeMuttonCommand1 = new BakeMuttonCommand(barbecuer);
     6     
     7       Command bakeMuttonCommand2 = new BakeMuttonCommand(barbecuer);
     8     
     9       Command bakeChickenWingCommand = new BakeChickenWingCommand(barbecuer);
    10     
    11       Waiter girl = new Waiter();
    12     
    13       girl.setOrder(bakeMuttonCommand1);
    14     
    15       girl.setOrder(bakeMuttonCommand2);
    16     
    17       girl.setOrder(bakeChickenWingCommand);
    18     
    19       girl.book();
    20     }

    打印结果:

    添加订单:命令模式.烤羊肉
    添加订单:命令模式.烤羊肉
    添加订单:命令模式.烤鸡翅
    烤羊肉
    烤羊肉
    烤鸡翅

  • 相关阅读:
    net start mongodb 提示:发生系统错误 5,拒绝访问。
    jquery下载所有版本
    国内优秀开源镜像站汇总
    bootstrap导航条报错 Uncaught TypeError: Cannot convert object to primitive value
    null的坑 和 比较运算符、相等运算符的隐式转换问题 (在javascript中,null>=0 为真,null<=0 为真,null==0却为假,null到底是什么?)
    关于 圣杯布局(双飞翼布局)的一些想法
    如何制作图标字体(如何将svg转换为css可用的图标字体)
    VirtualBox-虚拟硬盘扩容-win7
    前端JS导出表格
    JS判断是否是IE浏览器
  • 原文地址:https://www.cnblogs.com/xuekyo/p/2614039.html
Copyright © 2011-2022 走看看