一、定义
定义:将一个请求封装成一个对象,从而使您可以用不同的请求对客户进行参数化。对请求排队或记录请求日志,以及支持可撤消的操作。
主要解决:在软件系统中,行为请求者与行为实现者通常是一种紧耦合的关系,但某些场合,比如需要对行为进行记录、撤销或重做、事务等处理时,这种无法抵御变化的紧耦合的设计就不太合适。
何时使用:在某些场合,比如要对行为进行"记录、撤销/重做、事务"等处理,这种无法抵御变化的紧耦合是不合适的。在这种情况下,如何将"行为请求者"与"行为实现者"解耦?将一组行为抽象为对象,可以实现二者之间的松耦合。
如何解决:通过调用者调用接受者执行命令,顺序:调用者→接受者→命令。
二、结构
从命令模式的结构图可以看出,它涉及到五个角色,它们分别是:
- 客户角色:发出一个具体的命令并确定其接受者。
- 命令角色:声明了一个给所有具体命令类实现的抽象接口
- 具体命令角色:定义了一个接受者和行为的弱耦合,负责调用接受者的相应方法。
- 请求者角色:负责调用命令对象执行命令。
- 接受者角色:负责具体行为的执行。
三、适用场景
认为是命令的地方都可以使用命令模式,比如: 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设计模式之目录