Head First设计模式之命令模式

一、定义

定义:将一个请求封装成一个对象,从而使您可以用不同的请求对客户进行参数化。对请求排队或记录请求日志,以及支持可撤消的操作。

主要解决:在软件系统中,行为请求者与行为实现者通常是一种紧耦合的关系,但某些场合,比如需要对行为进行记录、撤销或重做、事务等处理时,这种无法抵御变化的紧耦合的设计就不太合适。

何时使用:在某些场合,比如要对行为进行"记录、撤销/重做、事务"等处理,这种无法抵御变化的紧耦合是不合适的。在这种情况下,如何将"行为请求者"与"行为实现者"解耦?将一组行为抽象为对象,可以实现二者之间的松耦合。

如何解决:通过调用者调用接受者执行命令,顺序:调用者→接受者→命令。

二、结构

 

从命令模式的结构图可以看出,它涉及到五个角色,它们分别是:

  • 客户角色:发出一个具体的命令并确定其接受者。
  • 命令角色:声明了一个给所有具体命令类实现的抽象接口
  • 具体命令角色:定义了一个接受者和行为的弱耦合,负责调用接受者的相应方法。
  • 请求者角色:负责调用命令对象执行命令。
  • 接受者角色:负责具体行为的执行。

三、适用场景

 认为是命令的地方都可以使用命令模式,比如: 1、GUI 中每一个按钮都是一条命令。 2、模拟 CMD。

四、优缺点

优点: 1、降低了系统耦合度。 2、新的命令可以很容易添加到系统中去。

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

五、实现

 

 /// <summary>  /// 电视机  /// </summary>  public class Television{/// <summary>  /// 模式是关闭的  /// </summary>  bool isopen = false;/// <summary>  /// 切换关闭、打开  /// </summary>  public string Switch(){if (isopen){isopen = false;return "关闭电视机";}else{isopen = true;return "打开电视机";}}}/// <summary>  /// 命令接口  /// </summary>  public interface CommandInterface{/// <summary>  /// 执行命令  /// </summary>  string Execute();}/// <summary>  /// 电视机命令对象  /// </summary>  public class TeleisionCommand : CommandInterface{/// <summary>  /// 电视机对象  /// </summary>  private Television Tv = new Television();#region CommandInterface 成员  /// <summary>  /// 执行命令  /// </summary>  public string Execute(){return Tv.Switch();}#endregion}/// <summary>  /// 控制中心  /// </summary>  public static class ControlContent{private static CommandInterface Command;public static void SetControlObjectCommand(CommandInterface cobject){Command = cobject;}public static string ExecuteControlObject(){return Command.Execute();}}class Program{static void Main(string[] args){TeleisionCommand tvcommand = new TeleisionCommand();ControlContent.SetControlObjectCommand(tvcommand);Console.WriteLine(ControlContent.ExecuteControlObject());Console.WriteLine(ControlContent.ExecuteControlObject());Console.ReadLine();}}

 

 

 参考

http://wangqingpei557.blog.51cto.com/1009349/626464/

http://www.runoob.com/design-pattern/command-pattern.html

 

 

欢迎阅读本系列文章:Head First设计模式之目录 

 

转载于:https://www.cnblogs.com/xcsn/p/7500623.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:https://dhexx.cn/news/show-18352.html

如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网进行投诉反馈,一经查实,立即删除!


相关文章:

  • 安装debian 9.1后,中文环境下将home目录下文件夹改为对应的英文
  • 加密算法IV的作用
  • SpringBoot 分布式session
  • 9,求整数的二进制中1的个数《剑指offer》
  • FastJson(阿里巴巴)基础
  • struts入门实例
  • 软件工程第二次作业——个人项目
  • C# 5.0 CallerMemberName CallerFilePath CallerLineNumber获取调用方法名称,路径,行号
  • 《结对-航空购票系统-开发环境搭建过程》
  • 20170831_安装软件
  • 寻找Harris、Shi-Tomasi和亚像素角点
  • qemu模拟器下编译运行基于riscv指令集的Linux操作系统
  • C# 文件上传
  • loadrunner要点总结
  • Spark总结1
  • 第一次作业_U201410737 _万学远
  • Eclipse在当前行之上插入一行
  • Android Studio运行程序出现Session ‘app’: Error Launching activity 解决办法
  • Git 分支及bug分支合并
  • C#参数详解
  • C#给图片加文字水印
  • Appium+python自动化17-启动iOS模拟器APP源码案例
  • sql server使用的注意点及优化点 自备
  • JDK编码
  • AssetPostprocessor.OnPreprocessModel
  • dedecms织梦让channelartlist标签支持currentstyle属性
  • 从github下载的项目如何运行??---------本文以vue的项目为例
  • openwrt源码下载移植
  • DC guide ---3
  • [hiho1160] 攻城略地
  • 题目整理0924
  • lumen安装后输出hello world
  • JS--微信浏览器复制到剪贴板实现
  • 网络对抗实验一
  • Vue-cli proxyTable 解决开发环境的跨域问题
  • HIVE基础操作
  • [Python] Different ways to test multiple flags at once in Python
  • vue实现侧边栏手风琴效果
  • js获取元素,窗口的宽度、高度
  • cCupcake---ToFu
  • 在Linux上显示某个进程的线程的几种方式
  • Yii2 upload
  • HDU 2014 - 青年歌手大奖赛_评委会打分
  • Cent OS 下 VI 使用方法
  • 10.5~10.6复习与预习的进行
  • 神奇DP [HNOI2004] 打砖块
  • junit搭配hamcrest使用
  • weblogic查看版本号教程
  • shell脚本需求
  • lightoj 1382 - The Queue(树形dp)