命令模式之做我的齐天大圣还是奉旨上界

       话说,《西游记》中有这样一段故事,玉帝命令太白金星召美猴王上天:"金星径入水帘洞当中,面南立定道:我是西方太白金星,奉玉帝招安圣旨,请你上界报道,拜受仙录。具体对话内容如下所示:

       太白金星:大圣,我主玉帝听说你才能出众,对你非常期待啊。
       孙大圣:是么,真的?
       太白金星:上界众仙也很仰慕大圣你啊。
       孙大圣:这......
       太白金星:大圣还犹豫是么?
       孙大圣:我去做什么?
       太白金星:绝对一把手,你的地盘好像很大,具体上去就知道了。
       孙大圣:那我去看看也好。
       太白金星:哈哈,大圣,请!

       今天我们的设计模式就从孙大圣上界报道开始说起---命令模式,即将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可撤消的操作。在软件系统中,“行为请求者”与“行为实现者”通常呈现一种“紧耦合”。但在某些场合,比如要对行为进行“记录、撤销/重做、事务”等处理,这种无法抵御变化的紧耦合是不合适的。在这种情况下,如何将“行为请求者”与“行为实现者”解耦?将一组行为抽象为对象,实现二者之间的松耦合。

       命令模式属于行为模式。意图是将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化;对请求的排队或记录请求的日志,以及支持可以撤销的操作。又叫动作(Action)或者事务(Transaction)。有时必须向一个对象提交请求,但是并不知道关于被请求的操作或者请求的接受者的任何信息。命令模式通过将请求本身变成一个对象来使工具箱对象可向未指定的应用对象提出请求,这个对象可以被存储并像其他的对象一样被传递,这一个模式的关键是抽象的Command类,它定义了一个执行操作的接口,其最简单的形式是一个抽象的Execute操作,具体的Command子类将接收者作为其一个实例变量,并实现Execute操作,制定接收者采取的动作,而接收者有执行该请求所需的具体信息。这就是命令模式(Command
Pattern)首先来看一下命令模式的结构图:

        

       来分析一下,孙悟空上界报道中的逻辑关系,'"玉帝是系统的客户端,太白金星是命令的发出者,猴王是命令的接收者,圣旨就是命令。玉帝的这一道命令就是要求猴王到上界报到。玉帝只管发出命令,而不管命令是怎样传达到美猴王的。太白金星负责将圣旨传到,可是美猴王怎么执行圣旨、何时执行圣旨是美猴王自己的事。来看一下代码实现:

        

<span style="font-size:18px;">using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            ImperialEdict i = new ImperialEdict();
            Command c = new ReportCommand();
            Venus v = new Venus();
            v.ObtainOrder();
            v.ExcuteCommand();
            Console.Read();
        }
    }

    //抽象命令类
    //抽象命令
    public abstract  class Command
    {
        protected Imperial receiver;
        public Command(Imperial receiver)
        {
            this.receiver = receiver;
        }

        //执行命令
        abstract public void ExcuteCommand();
    }

    //具体命令类
    //上界报到命令
    class ReportCommand : Imperial
    {
        public ReportCommand(Imperial receiver)
           :base(receiver)
          { }

          public override void ExcuteCommand()
           {
             receiver.Report();
           }
    }

    //太白金星
    public class Venus
    {
        private Imperial command;

        //收到命令
        public void ObtainOrder(Imperial command)
        {
            this.command =command ;
        }

        //执行命令
        public void Notify()
        {
            command.ExcuteCommand ();
        }
    }

    //猴王
    public class MonkeyKing
    {
        //上界报道
        public void Imperial()
        {
            Console .WriteLine ("上界报道!");
        }

    }

}
</span>

        对于命令模式,我们可以这样理解,提供一个抽象的Command接口,将执行命令操作的方法封装到Command类接口中,ConcreteCommand实现这个Command接口方法,通过调用Receiver实例变量处理请求。客户端定义一个Invoker对象存储该concreteCommand对象,该invoker通过调用command对象的递交一个请求。

时间: 2024-10-22 21:36:56

命令模式之做我的齐天大圣还是奉旨上界的相关文章

命令模式

1.什么是命令模式? 命令模式(Commond Pattern):将来自客户端的请求封装为一个对象,无需了解这个请求激活的动作或有关接受这个请求的处理细节.命令模式的根本目的在于将"请求者"与"实现者"之间解耦. 其实命令模式和其他许多设计模式一样,就是在请求者和实现者中间加一个中间人的角色,来达到解除耦合的目的.通过对中间人的特殊设置,从而形成不同的设计模式,命令模式也不例外.命令模式正是通过一个中间的命令者角色完成请求与实现之间的解耦. 2.命令模式的类图: 命

.NET中的设计模式四:命令模式

设计 命令模式(Command)结构并不复杂,简单的说,就是将某些职责封装成对象,对象的激发者(Invoker)和接收者(Reciever)都不过问命令的执行过程.用这样的方式解除了激发者和接受者之间的耦合,为程序提供了更清晰的层次结构.实际运用中经常是将系统中的命令抽象成一个接口,所有的命令都是这个接口的实现,如下所示: Command类是ICommand的实现,Command类实现了execute方法,其他命令类都是Command方法的子类.这样激发者接受者和接受者面临的环境就非常简单了:统

浅谈简单工作流设计——责任链模式配合策略与命令模式的实现

本文以项目中的一个工作流模块,演示责任链模式.策略模式.命令模式的组合实现! 流程简介 最近在做的一个项目,涉及到的是一个流程性质的需求.关于工程机械行业的服务流程:服务任务流程和备件发运流程. 项目之初,需求不是很清晰,算是演化模型吧.先出一个简单版本,然后根据用户的使用情况,再进一步探测新需求.所以也就是说这两个流程中的每一步暂时都不是固定的,而应该是可配置.可增减的. 目前暂定的两个流程示意图如下: 以上为两个流程的大致过程,当然实际过程中,可能还要走其他的流程. 但是,仔细分析,你会看到

分布式命令模式——互联系统的一种可扩展的命令模式

分布式命令模式是一种用来解决架构设计的建议模式.相比设计通常的应用而言,在互联系统中应该更多地考虑使用它.这种模式的目标是让独立系统与互联系统都有相同的设计.这种模式允许开发者将精力集中在设计一个遵循命令模式的通常的应用上,而不需要考虑该应用将与其他的系统相连.这种模式在设计命令时将开发者从考虑传输和通信协议中解放出来,并且能保持系统的简洁性.当某些命令被执行时,设计者不需要担心怎样发送必要的数据给服务器,以及怎样处理从服务器接收到的数据然后反应到互联应用的UI上.当一条命令在一个本地运行系统上

详解Java设计模式编程中命令模式的项目结构实现_java

正论: 命令模式把一个请求或者操作封装到一个对象中.命令模式运行系统使用不同的请求把客户端参数化,对请求排队或者记录请求日志,可以提供命令的撤销和恢复功能. 通俗: 其实很好理解.命令模式,关心的就是命令(或者称为操作).打个比方.在一个公司里面,整个运作就像一个系统.某个boss发布了一个命令,中层领导接到这个命令,然后指派给具体负责这个员工.整个流程很清晰吧.有一个需求,如何将这个流程固定下来,形成一个系统.我们只要抓住了重点:命令.将它抽取出来,其他的都迎刃而解了.抽取出命令,封装成一个独

设计模式系列之十:命令模式

前言 命令模式属于行为型设计模式.所谓命令,肯定有命令的发送者以及命令的接收者,命令模式则是命令本身封装成一个对象,从而使得命令接收者可以根据接收到的命令让不同的命令执行者执行具体的命令,使用命令模式可以让命令请求者排队并记录命令日志.命令模式可以使你可用不同的请求对客户参数化.很显然,通过使用命令模式可以较容易地设计一个命令队列,最重要的是命令模式把命令请求的对象与具体执行命令的对象分隔开了,这样具体的命令执行者与命令请求者之间的耦合度就降低了.使用命令模式可以很容易添加命令撤销的操作,但是一

C# 命令模式

一.命令模式:         将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化:对请求排队或记录请求日志,以及支持可撤销的操作. --<设计模式> 二.模式结构: Command:         定义命令的接口,声明执行的方法. ConcreteCommand:         命令接口实现对象,是"虚"的实现:通常会持有接收者,并调用接收者的功能来完成命令要执行的操作. Receiver:         接收者,真正执行命令的对象.任何类都可能成为一

设计模式之命令模式

        在日常生活中,我们常常会遇到这样一些问题:需要向某些对象发送请求,但是并不知道请求的接收者是谁,也不知道被请求的操作是哪个,我们只需在程序运行时指定具体的请求接收者即可,此时,可以使用命令模式来进行设计,使得请求发送者与请求接收者消除彼此之间的耦合,让对象之间的调用关系更加灵活.        命令模式是非常实用的一个模式,比如最常用的就是我们编写项目中用到的撤销\恢复(Undo\Redo)就是通过命令模式(Command)来实现的;在如我们的计算器.小孩通过遥控器控制赛车运动,

设计模式:命令模式(Command)

 将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化:对请求排队或记录请求日志,以支持可撤销的操作. 命令模式的角色 1. 客户端角色(Client):创建一个具体命令(ConcreteCommand)对象并确定其接收者. 2. 命令角色(Command):声明一个给所有命令类的抽象接口. 3. 具体命令角色(ConcreteCommand):定义一个接收者和行为之间的弱耦合:实现execute()方法,负责调用接收者的相应操作.execute()方法叫做执行方法. 4. 请求者角