zoukankan      html  css  js  c++  java
  • 设计模式学习之——命令模式

     定义

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

     命令模式涉及到五个角色,它们分别是:

      ●  客户端(Client)角色:创建一个具体命令(ConcreteCommand)对象并确定其接收者。

      ●  命令(Command)角色:声明了一个给所有具体命令类的抽象接口。

      ●  具体命令(ConcreteCommand)角色:定义一个接收者和行为之间的弱耦合;实现execute()方法,负责调用接收者的相应操作。execute()方法通常叫做执行方法。

      ●  请求者(Invoker)角色:负责调用命令对象执行请求,相关的方法叫做行动方法。

      ●  接收者(Receiver)角色:负责具体实施和执行一个请求。任何一个类都可以成为接收者,实施和执行请求的方法叫做行动方法。

    优点:
    • 它能较容易地设计一个命令队列
    • 在需要的情况下,可用容易的将命令记入日志
    • 允许接受请求的一方决定是否否决请求
    • 可用容易的实现对请求的撤销和重做
    • 由于加进的具体命令类不影响其他的类,因此增加新的具体命令类很容易
    • 命令模式把请求一个操作的对象与指导怎么执行一个操作的对象分隔开

     实例:

      主要实现功能:客户打算要点两次烤羊肉,一次烤鸡肉。

    package com.zcr.Command;
    
    //烧烤人员
    public class Barbecuer
    {
        //烤羊肉
        public void BakeMutton()
        {
            System.out.println("烤羊肉!!");
        }
        
        //烤鸡翅
        public void BakeChickenWing()
        {
            System.out.println("烤鸡翅!!");
        }
    }

     抽象命令类

    package com.zcr.Command;
    
    public abstract class Command
    {
        protected Barbecuer receiver;
        
        public Command()
        {
            
        }
        
        public Command(Barbecuer barbecuer)
        {
            this.receiver = barbecuer;
        }
        
        //执行命令
        abstract public void ExcuteCommand();
    }

     具体命令类

    package com.zcr.Command;
    
    //烤鸡翅命令
    public class BakeChickenWingCommand extends Command
    {
        public BakeChickenWingCommand(Barbecuer barbecuer)
        {
            //receiver 来自父类
            receiver = barbecuer;
        }
    
        @Override
        public void ExcuteCommand()
        {
            receiver.BakeChickenWing();
    
        }
        
    }

     具体命令类

    package com.zcr.Command;
    
    //烤羊肉命令
    public class BakeMuttonCommand extends Command
    {
        public BakeMuttonCommand(Barbecuer barbecuer)
        {
            //receiver 来自父类
            receiver = barbecuer;
        }
    
        @Override
        public void ExcuteCommand()
        {
            receiver.BakeMutton();
            
        }
        
    }

     服务员类

    package com.zcr.Command;
    
    public class Waiter
    {
        private Command command;
        
        //设置订单
        public void SetOrder(Command command)
        {
            this.command = command;
        }
        
        //通知执行
        public void Notify()
        {
            command.ExcuteCommand();
        }
    }
    package com.zcr.Command;
    
    public class TestCommand
    {
        public static void main(String[] args)
        {
            //开店前准备,烧烤店实现就找好了烤肉厨师,服务员和烤肉菜单没等客户上门
            Barbecuer boy = new Barbecuer();
            Command bakeMuttonCommand1 = new BakeMuttonCommand(boy);
            Command bakeMuttonCommand2 = new BakeMuttonCommand(boy);
            Command bakeChiCommand = new BakeChickenWingCommand(boy);
            Waiter girl = new Waiter();
            
            //开门营业,
            girl.SetOrder(bakeMuttonCommand1);
            girl.Notify();
            girl.SetOrder(bakeMuttonCommand2);
            girl.Notify();
            girl.SetOrder(bakeChiCommand);
            girl.Notify();    
        }
    }
  • 相关阅读:
    iOS开发UI篇—控制器的View的创建
    iOS开发UI篇—控制器的创建
    iOS开发UI篇—UIWindow简单介绍
    iOS开发UI篇—导航控制器属性和基本使用
    按照官网的升级完socket.io报错Manager is being released。
    npm和yarn的区别,我们该如何选择?
    iOS性能优化-数组、字典便利时间复杂
    OC CollectionView和TableView自身高度的隐式递归计算,改变父试图布局
    阿里系手淘weex学习第一天
    iOS邓白氏编码申请流程及苹果账号组织名称变更
  • 原文地址:https://www.cnblogs.com/0201zcr/p/4610116.html
Copyright © 2011-2022 走看看