模式的定义与特点

命令模式(Command Pattern),是将一个请求封装成一个对象,从而使您可以用不同的请求对客户进行参数化。命令模式是把发出命令的责任和执行命令的责任分割开,委派给不同的对象。命令模式允许请求的一方和发送的一方独立开来,使得请求的一方不必知道接收请求的一方的接口,更不必知道请求是怎么被接收,以及操作是否执行,何时被执行以及是怎么被执行的。系统支持命令的撤消。

模式的优点

  • 可扩展性较好,灵活。
  • 降低了系统耦合度。
  • 新的命令可以很容易添加到系统中去。

模式的缺点

  • 使用命令模式可能会导致某些系统有过多的具体命令类。

using DesignPattern.CommandPattern;
using System; namespace DesignPattern
{
internal class Program
{
static void Main(string[] args)
{
CommandHelper();
} #region Pattern - Command
static void CommandHelper()
{
Invoker _invoker = new Invoker();
Receiver _receiver = new Receiver();
ICommand _concreteCommand = new ConcreteCommand(_receiver); _invoker.SetCommand(_concreteCommand);
_invoker.ExecuteCommand(); Console.ReadLine();
}
#endregion
}
} //====================================================================================== namespace DesignPattern.CommandPattern
{
/// <summary>
/// 命令,需要执行的所有命令都在这里声明。
/// </summary>
internal interface ICommand
{
/// <summary>
/// 发布命令
/// </summary>
void Exrcute();
} //====================================================================================== /// <summary>
/// 调用命令者,绑定一个命令,并执行该命令。
/// </summary>
internal class Invoker
{
private ICommand m_command; public void SetCommand(ICommand command)
{
this.m_command = command;
} public void ExecuteCommand()
{
m_command.Exrcute();
}
} //====================================================================================== /// <summary>
/// 命令接收者、执行者。 任何类都可以成为接收者
/// </summary>
internal class Receiver
{
public void Function()
{
Console.WriteLine("接收者接到命令,并且执行了");
}
} //====================================================================================== /// <summary>
/// 一个具体的命令
/// </summary>
internal class ConcreteCommand : ICommand
{
Receiver m_receiver;
/// <summary>
/// 一个具体的命令,将一个接收者绑定,调用接收者相应的操作,以实现执行命令。
/// </summary>
public ConcreteCommand(Receiver receiver)
{
this.m_receiver = receiver;
} public void Exrcute()
{
m_receiver.Function();
}
}
}

总结:

个人觉得命令者模式,和我们常用的事件差不多,ICommand等于Event,Receiver等于被注册的函数,Invoker等于执行Event的函数。拙见,不对的话还望指出。


希望大家:点赞,留言,关注咯~

唠家常

今日分享结束啦,小伙伴们你们get到了么,你们有没有更好的办法呢,可以评论区留言分享,也可以加QQ:841298494,大家一起进步。

  • 客官,看完get之后记得点赞哟!
  • 小伙伴你还想要别的知识?好的呀,分享给你们

今日推荐

最新文章

  1. iOS网络相关知识总结
  2. input失去隐藏光标(移动端)
  3. salesforce 零基础学习(三十九) soql函数以及常量
  4. Docker上运行dotnet core
  5. CSS设计模式之三权分立模式篇
  6. transactionCurrencyId needs to be supplied to format a transaction money field.
  7. IE6 png 透明 (三种解决方法)
  8. ArcGIS for Silverlight 地图卷帘
  9. php jquery+ajax写批量删除
  10. MYSQL的REPLACE和ON DUPLICATE KEY UPDATE使用
  11. 关于Springmvc中include与Sitemesh装饰器的基本使用
  12. 开发函数计算的正确姿势 —— 使用 Fun Local 本地运行与调试
  13. R语言学习——实例标识符
  14. [数学笔记Mathematical Notes]1-调和级数发散的一个简单证明
  15. Codeforces Round #485 (Div. 2) F. AND Graph
  16. Spring Boot Starter 的基本封装
  17. cloud_note项目
  18. JAVA(四)类集/枚举
  19. pip离线安装软件包
  20. HTTP API 设计指南(结尾)

热门文章

  1. Java安全之Tomcat6 Filter内存马
  2. rocky二进制安装mysql8.0
  3. 支持向量机(SVM)公式整理
  4. 【Azure API 管理】Azure APIM服务集成在内部虚拟网络后,在内部环境中打开APIM门户使用APIs中的TEST功能失败
  5. November 练习(Tou Xue)打卡
  6. golang内置包管理工具go mod简明教程
  7. JUC学习笔记——并发工具线程池
  8. mysql不需要密码,乱输入密码就能进去。。。。解决
  9. adb版本不同导致一个服务杀死另一个服务
  10. 关于Linux pyinstaller打包zmq.h报错