Java语言设计模式学习之命令模式实例讲解
小标 2018-10-12 来源 : 阅读 1167 评论 0

摘要:本文主要向大家介绍了Java语言设计模式学习之命令模式实例讲解,通过具体的内容向大家展示,希望对大家学习JAVA语言有所帮助。

本文主要向大家介绍了Java语言设计模式学习之命令模式实例讲解,通过具体的内容向大家展示,希望对大家学习JAVA语言有所帮助。


Command:


定义命令的接口,声明执行的方法。


ConcreteCommand:


具体的命令, 实现命令接口;通常会持有接收者,并调用接收者的功能来完成命令要执行的操作。


Receiver:


接收者,真正执行命令的对象。任何类都可能成为一个接收者,只要它能够实现命令要求实现的相应功能。


Invoker:


要求命令对象执行请求,通常会持有命令对象,可以持有很多的命令对象。这个是客户端真正触发命令并要求命令执行相应操作的地方,也就是说相当于使用命令对象的入口。


Client:


创建具体的命令对象,并且设置命令对象的接收者。注意这个不是我们常规意义上的客户端,而是在组装命令对象和接收者,或许,把这个Client称为装配者会更好理解,因为真正使用命令的客户端是从Invoker来触发执行。


这里采用从实例到定义,倒着描述的方式,先从实例入手,有个大致印象,有助于理解。


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


分析:帅哥顾客,土豪订单,美女服务员,资深大厨的角色是什么?


帅哥顾客:Client


土豪订单:实现Command接口的具体Command


美女服务员:Invoker


资深大厨:Receiver


代码实现:


Command接口


   

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.Threading.Tasks;

 

namespace Wolfy.命令模式

{

    /// <summary>

    /// Command为所有命令声明一个接口,调用命令对象的excute方法

    /// 就可以让接收者进行相关的动作,

    /// </summary>

    public abstract class Command

    {

        public abstract void Execute();

    }

}


using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.Threading;

using System.Threading.Tasks;

 

namespace Wolfy.命令模式

{

    /// <summary>

    /// 具体的命令

    /// </summary>

    public class OrderCommand : Command

    {

        /// <summary>

        ///持有接受者对象

        /// </summary>

        SeniorChef receiver;

        Order order;

        public OrderCommand(SeniorChef receiver, Order order)

        {

            this.receiver = receiver;

            this.order = order;

        }

        public override void Execute()

        {

         

            Console.WriteLine("{0}桌的订单:", order.DiningTable);

            foreach (string item in order.FoodDic.Keys)

            {

                //通常会转调接收者对象的相应方法,让接收者来真正执行功能

                receiver.MakeFood(order.FoodDic[item],item);

            }

            Thread.Sleep(2000);//停顿一下 模拟做饭的过程

 

            Console.WriteLine("{0}桌的饭弄好了", order.DiningTable);

        }

    }

}

   


Waitor:Invoker调用者,seniorChef:接收者 厨师类


using System;

using System.Collections;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.Threading.Tasks;

 

namespace Wolfy.命令模式

{

    /// <summary>

    /// 美女服务员类 这里作为调用者Invoker的角色

    /// </summary>

    public class Waitor

    {

        ArrayList commands = null;//可以持有很多的命令对象

        public Waitor()

        {

            commands = new ArrayList();

        }

        public void SetCommand(Command cmd)

        {

            commands.Add(cmd);

        }

        /// <summary>

        /// 提交订单 喊 订单来了,厨师开始执行

        /// </summary>

        public void OrderUp()

        {

            Console.WriteLine("美女服务员:叮咚,大厨,新订单来了.......");

            Console.WriteLine("资深厨师:收到");

            for (int i = 0; i < commands.Count; i++)

            {

                Command cmd = commands[i] as Command;

                if (cmd != null)

                {

                    cmd.Execute();

                }

            }

        }

    }

}

 

Waitor



using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.Threading.Tasks;

 

namespace Wolfy.命令模式

{

    /// <summary>

    /// 资深大厨类 是命令的Receiver

    /// </summary>

    public class SeniorChef

    {

        public void MakeFood(int num,string foodName)

        {

            Console.WriteLine("{0}份{1}", num,foodName);

        }

    }

}

 

SeniorChef

   


订单Order,封装订单内容,然后传入OrderCommand,将订单对象变为命令对象


本文由职坐标整理并发布,希望对同学们有所帮助。了解更多详情请关注编程语言JAVA频道!



using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.Threading.Tasks;

 

namespace Wolfy.命令模式

{

    /// <summary>

    /// 订单

    /// </summary>

    public class Order

    {

        /// <summary>

        /// 餐桌号码

        /// </summary>

        public int DiningTable { set; get; }

        /// <summary>

        /// food  key:饭名 value:多少份

        /// </summary>

        public Dictionary<string, int=""> FoodDic { set; get; }

    }

}

 

Order</string,>

   


本文由 @小标 发布于职坐标。未经许可,禁止转载。
喜欢 | 1 不喜欢 | 0
看完这篇文章有何感觉?已经有1人表态,100%的人喜欢 快给朋友分享吧~
评论(0)
后参与评论

您输入的评论内容中包含违禁敏感词

我知道了

助您圆梦职场 匹配合适岗位
验证码手机号,获得海同独家IT培训资料
选择就业方向:
人工智能物联网
大数据开发/分析
人工智能Python
Java全栈开发
WEB前端+H5

请输入正确的手机号码

请输入正确的验证码

获取验证码

您今天的短信下发次数太多了,明天再试试吧!

提交

我们会在第一时间安排职业规划师联系您!

您也可以联系我们的职业规划师咨询:

小职老师的微信号:z_zhizuobiao
小职老师的微信号:z_zhizuobiao

版权所有 职坐标-一站式IT培训就业服务领导者 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
 沪公网安备 31011502005948号    

©2015 www.zhizuobiao.com All Rights Reserved

208小时内训课程