在.Net框架中很多对象的方法中都会有Invoke方法,这种方法的设计实际是用了设计模式的命令模式,

模式图如下

其核心思路是将Client 向Receiver发送的命令行为进行抽象(ICommand),实例化(ConcreteCommand),以便对这些行为能够控制(记录,取消,恢复);

每个Command与Client是解耦的,即不依赖具体客户,调度者Invoker可以负责记录,控制客户执行了那些请求,与客户端存在单一的关联。

示例:计算器(Calculator)可以执行很多计算操作,客户(client)向指定的接收者发送指令,命令从客户到达接收者实际上是间接进行的,是先通过调度者(Invoker)将指定的输入(state)和指定的命令,传递给接收者,接受者再执行具体的任务。代码如下

//示例:一个计算器,接受用户的计算请求,计算器提供一些计算方法,要求请求任务中过程可以记录请求的行为,请求中状态的变化和请求继续和取消
public class Client
{
public Invoker Invoker { get; set; } = new Invoker();
//简化代码
public void Invoke(string CommandName,params object[] states)
{
Invoker.Invoke(CommandName, states);
}
//简化代码
public void Invoke(string CommandName,out object result,params object[] states)
{
Invoker.Invoke(CommandName, out result, states);
} } public class Invoker
{
public Dictionary<string, ICommand> Commands { get; set; } = new Dictionary<string, ICommand>(); /// <summary>
///
/// </summary>
/// <param name="CommandName"></param>
/// <param name="returnResult">需要返回结果的命令</param>
/// <param name="states"></param>
public void Invoke(string CommandName,out object returnResult, params object[] states)
{
//传递参数
Commands[CommandName].State = states;
//执行操作
Commands[CommandName].Execute();
returnResult = Commands[CommandName].State;
}
/// <summary>
/// 无需返回结果
/// </summary>
/// <param name="CommandName"></param>
/// <param name="states"></param>
public void Invoke(string CommandName,params object[] states)
{
//传递参数
Commands[CommandName].State = states;
//执行操作
Commands[CommandName].Execute();
} //下面可以写一些方法用来恢复数据或记录行为
//可以在Invoke 方法中使用异步方法放入token来中断执行,并将State恢复到原来状态 } public interface ICommand
{
string CommandName { get; set; }
object State { get; set; }//记录状态,可以是数据
void Execute();
}
//求积运算
public class CalcuteMulCommand : ICommand
{
public string CommandName { get ; set ; }
public object State { get ; set ; } private object receiver;
public CalcuteMulCommand(object _receiver)
{
receiver = _receiver;
}
public void Execute()
{ State= ( (Calculator)receiver).Mutiply((int)((object[])State)[], (int)((object[])State)[]);
}
} internal class Calculator
{
public Calculator()
{
}
public double Mutiply(int a,int b)
{
return a * b;
}
} //测试代码

class Test
    {
        static void Main(string[] args)
        {
           
           
            Client client = new Client();
            client.Invoker.Commands.Add("CalcuteMulCommand", new CalcuteMulCommand(new Calculator()));
            object result;
            client.Invoke("CalcuteMulCommand",out result, 5, 2);


Console.WriteLine(result.ToString());
            Console.ReadKey();
        }
    }

 

面向对象设计模式_命令模式(Command)解读的更多相关文章

  1. 设计模式 ( 十三 ) 命令模式Command(对象行为型)

    设计模式 ( 十三 ) 命令模式Command(对象行为型) 1.概述         在软件设计中,我们经常需要向某些对象发送请求,但是并不知道请求的接收者是谁,也不知道被请求的操作是哪个,我们只需 ...

  2. 乐在其中设计模式(C#) - 命令模式(Command Pattern)

    原文:乐在其中设计模式(C#) - 命令模式(Command Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 命令模式(Command Pattern) 作者:webabcd ...

  3. 二十四种设计模式:命令模式(Command Pattern)

    命令模式(Command Pattern) 介绍将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化:对请求排队或记录请求日志,以及支持可取消的操作. 示例有一个Message实体类,某个 ...

  4. 设计模式-15命令模式(Command Pattern)

    1.模式动机 在软件设计中,我们经常需要向某些对象发送请求,但是并不知道请求的接收者是谁,也不知道被请求的操作是哪个,我们只需在程序运行时指定具体的请求接收者即可,此时,可以使用命令模式来进行设计,使 ...

  5. [设计模式] 14 命令模式 Command

    Command 模式通过将请求封装到一个对象(Command)中,并将请求的接受者存放到具体的 ConcreteCommand 类中(Receiver)中,从而实现调用操作的对象和操作的具体实现者之间 ...

  6. 设计模式之命令模式(Command)摘录

    23种GOF设计模式一般分为三大类:创建型模式.结构型模式.行为模式. 创建型模式抽象了实例化过程,它们帮助一个系统独立于怎样创建.组合和表示它的那些对象.一个类创建型模式使用继承改变被实例化的类,而 ...

  7. 大熊君说说JS与设计模式之------命令模式Command

    一,总体概要 1,笔者浅谈 日常生活中,我们在看电视的时候,通过遥控器选择我们喜欢的频道时,此时我们就是客户端的角色,遥控器的按钮相当于客户请求,而具体执行的对象就是命令对象, 命令模式把一个请求或者 ...

  8. java_设计模式_命令模式_Command Pattern(2016-08-09)

    理解还不到位,先窜出来.等过一阵子再看,再理解. 定义:将一个请求封装成一个对象,从而让你使用不同的请求把客户端参数化,对请求排队或者记录请求日志,可以提供命令的撤销和恢复功能. 类型:行为类模式 类 ...

  9. 设计模式 笔记 命令模式 Command

    //---------------------------15/04/25---------------------------- //Conmmand  命令模式----对象行为型模式 /* 1:意 ...

随机推荐

  1. puppeteer,新款headless chrome!

    puppeteer puppeteer是一种谷歌开发的Headless Chrome,因为puppeteer的出现,业内许多自动化测试库停止维护,比如PhantomJS,Selenium IDE fo ...

  2. HDU - 2154 线性dp

    思路:0表示A,1表示B,2表示C,d(i, j)表示在第j次时正好到达i. AC代码 #include <cstdio> #include <cmath> #include ...

  3. C++ 中vector的使用方法(转)

    原地址:http://blog.csdn.net/duan19920101/article/details/50617190/ 在c++中,vector是一个十分有用的容器. 作用:它能够像容器一样存 ...

  4. docker-compose 完整打包发布, 多服务,多节点SPRING CLOUD ,EUREKA 集群

    这里不再使用 端口映射的方式,因为不同主机上,Feign 根据 docker hostname访问会有问题. 把打包的好jar copy到docker镜像里 有几个服务,就复制几个dockerfile ...

  5. Phpstrom操作Git从服务器端克隆代码到本地

    1.第一步点开Git 2.添加项目的路径 第一个框是你所在的项目路径,后缀名是.git,这里我用的是HTTPS的方式(还有一种是SSH) 第二是你要克隆到所在目录,我的是在Apache下面的htdoc ...

  6. SPI知识总结

    SPI知识总结 一.定义 SPI(Serial Peripheral Interface--串行外设接口)总线系统是一种同步串行外设接口,它可以使MCU与各种外围设备以串行方式进行通信以交换信息. 优 ...

  7. Django使用模板后无法找到静态资源文件

    Django使用模板后无法找到静态资源文件 环境配置 Django版本1.11 python版本3.6.2 前言 在编写Django网站的时候,在涉及模板方面,一些简单的例子都没有问题,但这些例子都有 ...

  8. 利用js实现placeholder占位符,甩开ie不兼容

    正常的写法 <input type="text" placeholder="占位符"> 这种写法ie低版本的支持不友好,为了满足某些测试或者产品的变 ...

  9. NLP︱句子级、词语级以及句子-词语之间相似性(相关名称:文档特征、词特征、词权重)

    每每以为攀得众山小,可.每每又切实来到起点,大牛们,缓缓脚步来俺笔记葩分享一下吧,please~ --------------------------- 关于相似性以及文档特征.词特征有太多种说法.弄 ...

  10. 深度学习word2vec笔记之基础篇

    作者为falao_beiliu. 作者:杨超链接:http://www.zhihu.com/question/21661274/answer/19331979来源:知乎著作权归作者所有.商业转载请联系 ...