一,什么是命令模式(Command Pattern)?

命令模式:将请求封装成命令对象,请求的具体执行由命令接收者执行;

二,如下代码

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks; namespace _14.命令模式
{
//命令模式的本质是对命令进行封装,将发出命令的责任和执行命令的责任分割开。
//在软件系统中,行为请求者与行为实现者通常是一种紧耦合的关系,但某些场合,比如需要对行为进行记录、撤销或重做、事务等处理时,这种无法抵御变化的紧耦合的设计就不太合适。
class Program
{
/// <summary>
/// 中国人发出命令
/// </summary>
/// <param name="args"></param>
static void Main(string[] args)
{
// 初始化Receiver、Invoke和Command
Command c = new Command();
c.AddReceiver(new JanReceiver());
c.AddReceiver(new UsaReceiver());
ChineseInvoke i = new ChineseInvoke(c); ////中国人发出命令
i.ExecuteCommand();
}
}
/// <summary>
/// 中国人,负责调用命令对象执行请求
/// </summary>
public class ChineseInvoke
{
public Command _command; public ChineseInvoke(Command command)
{
this._command = command;
} public void ExecuteCommand()
{
Console.WriteLine("中国人说,该干啥子干啥子去!!");
_command.Action();
}
}
/// <summary>
/// 命令抽象类
/// </summary>
public class Command
{
// 命令执行方法
private List<Receiver> list = new List<Receiver>();
public void AddReceiver(Receiver receiver)
{
list.Add(receiver);
}
public void Action()
{
// 调用接收的方法,因为执行命令的是学生
foreach (var item in list)
{
item.Execute();
}
}
}
/// <summary>
/// 抽象接收者
/// </summary>
public abstract class Receiver
{
public abstract void Execute();
}
/// <summary>
/// 具体接收者
/// </summary>
public class JanReceiver:Receiver
{
public override void Execute()
{
Console.WriteLine("日本人吃饭");
}
}
/// <summary>
/// 具体接收者
/// </summary>
public class UsaReceiver : Receiver
{
public override void Execute()
{
Console.WriteLine("美国人吃饭");
}
} }

三,根据命令模式我们分为下面几个角色,

抽象命令 :Command

抽象接收者:Receiver

命令接收者:执行命令(JanReceiver,UsaReceiver)

命令调用者:(ChineseInvoke)

客户端:发送命令

四,在命令模式中,我们将客户端发送的指令封装成一个对象,如我们的吃和睡觉指令,我们将这两个行为以命令的形式包裹在一个对象中,然后传递给命令接受者执行命令,而这里调用者角色与接收者角色之间没有任何依赖关系,调用者实现功能时只需调用ChineseInvoke抽象类的ExecuteCommand方法就可以,实现命令的调用

最新文章

  1. 解决:PADS导入.DXF结构图出现坐标超出范围问题
  2. zabbix-agent配置文件说明
  3. java.lang.NoClassDefFoundError: org/springframework/context/ApplicationContext
  4. IntelliJ IDEA 部署Tomcat及创建一个web工程
  5. javascript笔记01:javascript入门介绍
  6. Javascript 类数组(Array-like)对象
  7. Hash Map (Hash Table)
  8. DeDeCMS中如何实现下拉菜单
  9. Binder机制,从Java到C (5. IBinder对象传递形式)
  10. Conscription poj3723(最大生成树)
  11. MySql常用命令集Mysql常用命令5
  12. 学习CSS布局 - position例子
  13. 使用log4net将C#日志发送到Elasticsearch
  14. 《Python》网络编程基础
  15. 【慕课网实战】Spark Streaming实时流处理项目实战笔记十二之铭文升级版
  16. [转]基于S2SH框架的项目—antlr-2.7.2.jar包冲突问题
  17. Django安装和配置环境变量
  18. sessionStorage与localStorage
  19. Git操作行
  20. 解析 Ceph: FileJournal 的作用

热门文章

  1. git的fetch
  2. 岭回归、lasso
  3. 容器镜像服务 联手 IDE 插件,实现一键部署、持续集成与交付
  4. STM32内部时钟设置-寄存器版
  5. RedisTemplate访问Redis数据结构(一)——String
  6. 使用OpenLayers 勾画地图
  7. Maps.newHashMap 和 new HashMap的区别
  8. svn 服务器操作
  9. 008-Spring Boot @EnableAutoConfiguration深入分析、内部如何使用EnableAutoConfiguration
  10. VMware 虚拟化编程(9) — VMware 虚拟机的快照