解读设计模式----命令模式(Command Pattern)
***本文与作者原文有一定的偏差,其中加入了一部分是个人看法,详细请查看作者原文。***
原文连接http://www.dofactory.com/Patterns/PatternCommand.aspx
命令模式意图:
GOF 在《设计模式》一书中阐述其意图:“将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可取消的操作。”这里所谓的“不同的请求”也既意味着请求可能发生的变化,是一个可能扩展的功能点。
命令模式UML图:
Command模式将一个请求封装为一个对象,从而使你可以使用不同的请求对客户进行参数化。
简单示例:
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
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
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
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
运行结果:
在众多的设计模式中,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)相关推荐
- 设计模式:命令模式(Command Pattern)
命令模式(Command Pattern): 在软件设计中,我们经常需要向某些对象发送请求,但是并不知道请求的接受者是谁,也不知道请求的操作是哪个. 我们只需在程序运行时指定具体的请求接受者即可,此时 ...
- 设计模式 - 命令模式(command pattern) 撤销(undo) 具体解释
命令模式(command pattern) 撤销(undo) 详细解释 本文地址: http://blog.csdn.net/caroline_wendy 參考命令模式: http://blog.cs ...
- 乐在其中设计模式(C#) - 命令模式(Command Pattern)
原文:乐在其中设计模式(C#) - 命令模式(Command Pattern) [索引页] [源码下载] 乐在其中设计模式(C#) - 命令模式(Command Pattern) 作者:webabcd ...
- 设计模式系列3-----C++实现命令模式(Command Pattern)
什么是命令模式? GoF的书的定义为:"Command pattern encapsulate request as an object, thereby letting you param ...
- C++设计模式--命令模式(Command)
概述 命令模式的结构很简单,但是对于消除代码间的耦合却有着重要的影响.命令模式就是一个函数对象:一个作为对象的函数.通过将函数封装为对象,就能够以参数的形式将其传递给其他函数或者对象,告诉它们在旅行请 ...
- 32命令模式(Command Pattern)
耦合与变化: 耦合是软件不能抵御变化灾难的根本性原因.不仅实体对象与实体对象之间存在耦合关系,实体对象与行为操作之间也存在耦合关系. ...
- 命令模式(Command pattern)及代码实现
模式定义: 将客户端的请求封装成一个对象(这个对象就是 命令对象),使请求的发送者 和请求的接收者 进行 责任分离解耦, 这样 两者只通过 命令进行交互;发送者 不关心 请求的具体实现细节, 接收者 ...
- Java设计模式-命令模式Command
定义 将来自客户端的请求传入一个对象,从而使你可用不同的请求对客户进行参数化.用于"行为请求者"与"行为实现者"解耦,可实现二者之间的松耦合,以便适应变化.分离 ...
- 趣谈设计模式 | 命令模式(Command):将命令封装为对象
文章目录 案例:智能遥控 命令模式 应用场景 队列请求 日志系统 总结 完整代码与文档 命令模式的应用场景较少,且不易理解,因此我也不好举例,所以下面的描述可能会存在一些问题,请见谅 案例:智能遥控 ...
最新文章
- 搜索suggest实现 动态的查询建议
- C代码+汇编 C的for汇编学习分析
- 92行JavaScript代码实现的类似Excel外观的UI
- SAP UI5 router的初始化逻辑
- 简述mysql 存储引擎_Mysql基础-存储引擎简述
- 数据特征分析-统计分析
- 小米范工具系列之二:小米范 web目录扫描器
- 项目开发中遇到的问题,原因,解决思路
- 教你怎么用爬虫程序采集企业信息及电话邮箱等信息(以企查查为例)
- 华为防火墙USG6000V三种管理方法
- 计算机excel求体重指数,excel标准差-制程能力指数(CPK)的定义及计算公式
- Docker安装filebeat
- 通过console线登录交换机
- java对文件进行md5加密,对文件进行 MD5 加密
- Panda白话 - G1垃圾收集器
- 系列笔记-USYD悉尼大学Data1001 RQuiz1——RQuiz6 做法讲解
- 【MySQL5.7指南】第一章——概述
- 常用Windows系统进程列表
- anaconda安装、部署、卸载——Mac
- 华为od统一考试B卷【用连续自然数之和来表达整数】C++ 实现
热门文章
- Tomcat服务器的安装及配置
- 轻快的VIM(三):删除
- React 相关资料
- UVa11988 Broken Keyboard(练习链表使用)
- 第十讲:Obj-C Blocks 应用
- 后台返回数据打印是[object object]的,报错:SyntaxError: JSON.parse: expected property name or ‘}‘ at line 1 column
- fragment 调用activity方法,如dispatchKeyEvent,dispatchTouchEvent
- ELK套件FileBeat部署
- docker中的容器和镜像
- Redis缓存,你真的懂了吗