***本文与作者原文有一定的偏差,其中加入了一部分是个人看法,详细请查看作者原文。***
原文连接http://www.dofactory.com/Patterns/PatternCommand.aspx

命令模式意图:
  GOF 在《设计模式》一书中阐述其意图:“将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可取消的操作。”这里所谓的“不同的请求”也既意味着请求可能发生的变化,是一个可能扩展的功能点。

命令模式UML图:
         
  Command模式将一个请求封装为一个对象,从而使你可以使用不同的请求对客户进行参数化。

简单示例:

Client
 1using System;
 2using System.Collections.Generic;
 3using System.Text;
 4
 5namespace DesignPattern.Command
 6{
 7    class Program
 8    {
 9        static void Main(string[] args)
10        {
11            // 创建receiver、command和invoker 
12            Receiver receiver = new Receiver();
13
14            //根据多态,父类的引用指向子类对象
15            Command command = new ConcreteCommand(receiver);
16            Invoker invoker = new Invoker();
17
18            //设置和执行命令
19            invoker.SetCommand(command);
20            invoker.ExecuteCommand();
21
22            Console.Read();
23        }
24    }
25}
26
Command
 1using System;
 2using System.Collections.Generic;
 3using System.Text;
 4
 5namespace DesignPattern.Command
 6{
 7    public abstract class Command
 8    {
 9        protected Receiver receiver;
10
11        /**//// <summary>
12        /// 构造器注入
13        /// </summary>
14        /// <param name="receiver"></param>
15        public Command(Receiver receiver)
16        {
17            this.receiver = receiver;
18        }
19
20        public abstract void Execute();
21    }
22}
23
Invoker
 1using System;
 2using System.Collections.Generic;
 3using System.Text;
 4
 5namespace DesignPattern.Command
 6{
 7    public class Invoker
 8    {
 9        private Command command;
10
11        public void SetCommand(Command command)
12        {
13            this.command = command;
14        }
15
16        public void ExecuteCommand()
17        {
18            command.Execute();
19        }
20    }
21}
22
Receiver
 1using System;
 2using System.Collections.Generic;
 3using System.Text;
 4
 5namespace DesignPattern.Command
 6{
 7    public class Receiver
 8    {
 9        public void Action()
10        {
11            Console.WriteLine("Called Receiver.Action()");
12        }
13    }
14}
15

运行结果:

Called Receiver.Action()

在众多的设计模式中,Command模式是很简单也很优雅的一种设计模式。Command模式它封装的是命令,把命令发出者的责任和命令执行者的责任分开。[TerryLee]

注意:
    如果比较类图结构,我门会发现Command模式、Strategy模式、State模式是完全一样的。事实正是如此,由于他门的设计思想都是对易于变化的部分进行抽象、或为接口。唯一的区别,就是所抽象的行为职责不同而已,这一点从各自的名字就可以看出。

参考资料:
TerryLee------.NET设计模式系列
Bruce Zhang---《软件设计精要与模式》
www.dofactory.com
本文示例源码下载

转载于:https://www.cnblogs.com/beniao/archive/2008/04/09/1145867.html

解读设计模式----命令模式(Command Pattern)相关推荐

  1. 设计模式:命令模式(Command Pattern)

    命令模式(Command Pattern): 在软件设计中,我们经常需要向某些对象发送请求,但是并不知道请求的接受者是谁,也不知道请求的操作是哪个. 我们只需在程序运行时指定具体的请求接受者即可,此时 ...

  2. 设计模式 - 命令模式(command pattern) 撤销(undo) 具体解释

    命令模式(command pattern) 撤销(undo) 详细解释 本文地址: http://blog.csdn.net/caroline_wendy 參考命令模式: http://blog.cs ...

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

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

  4. 设计模式系列3-----C++实现命令模式(Command Pattern)

    什么是命令模式? GoF的书的定义为:"Command pattern encapsulate request as an object, thereby letting you param ...

  5. C++设计模式--命令模式(Command)

    概述 命令模式的结构很简单,但是对于消除代码间的耦合却有着重要的影响.命令模式就是一个函数对象:一个作为对象的函数.通过将函数封装为对象,就能够以参数的形式将其传递给其他函数或者对象,告诉它们在旅行请 ...

  6. 32命令模式(Command Pattern)

    耦合与变化:     耦合是软件不能抵御变化灾难的根本性原因.不仅实体对象与实体对象之间存在耦合关系,实体对象与行为操作之间也存在耦合关系.                               ...

  7. 命令模式(Command pattern)及代码实现

    模式定义: 将客户端的请求封装成一个对象(这个对象就是 命令对象),使请求的发送者 和请求的接收者 进行 责任分离解耦, 这样 两者只通过 命令进行交互;发送者 不关心 请求的具体实现细节, 接收者 ...

  8. Java设计模式-命令模式Command

    定义 将来自客户端的请求传入一个对象,从而使你可用不同的请求对客户进行参数化.用于"行为请求者"与"行为实现者"解耦,可实现二者之间的松耦合,以便适应变化.分离 ...

  9. 趣谈设计模式 | 命令模式(Command):将命令封装为对象

    文章目录 案例:智能遥控 命令模式 应用场景 队列请求 日志系统 总结 完整代码与文档 命令模式的应用场景较少,且不易理解,因此我也不好举例,所以下面的描述可能会存在一些问题,请见谅 案例:智能遥控 ...

最新文章

  1. 搜索suggest实现 动态的查询建议
  2. C代码+汇编 C的for汇编学习分析
  3. 92行JavaScript代码实现的类似Excel外观的UI
  4. SAP UI5 router的初始化逻辑
  5. 简述mysql 存储引擎_Mysql基础-存储引擎简述
  6. 数据特征分析-统计分析
  7. 小米范工具系列之二:小米范 web目录扫描器
  8. 项目开发中遇到的问题,原因,解决思路
  9. 教你怎么用爬虫程序采集企业信息及电话邮箱等信息(以企查查为例)
  10. 华为防火墙USG6000V三种管理方法
  11. 计算机excel求体重指数,excel标准差-制程能力指数(CPK)的定义及计算公式
  12. Docker安装filebeat
  13. 通过console线登录交换机
  14. java对文件进行md5加密,对文件进行 MD5 加密
  15. Panda白话 - G1垃圾收集器
  16. 系列笔记-USYD悉尼大学Data1001 RQuiz1——RQuiz6 做法讲解
  17. 【MySQL5.7指南】第一章——概述
  18. 常用Windows系统进程列表
  19. anaconda安装、部署、卸载——Mac
  20. 华为od统一考试B卷【用连续自然数之和来表达整数】C++ 实现

热门文章

  1. Tomcat服务器的安装及配置
  2. 轻快的VIM(三):删除
  3. React 相关资料
  4. UVa11988 Broken Keyboard(练习链表使用)
  5. 第十讲:Obj-C Blocks 应用
  6. 后台返回数据打印是[object object]的,报错:SyntaxError: JSON.parse: expected property name or ‘}‘ at line 1 column
  7. fragment 调用activity方法,如dispatchKeyEvent,dispatchTouchEvent
  8. ELK套件FileBeat部署
  9. docker中的容器和镜像
  10. Redis缓存,你真的懂了吗