命令模式:
将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可取消的操作。
例:http://www.cnblogs.com/wangjq/archive/2012/07/11/2585930.html
/// <summary> /// 接收者类,知道如何实施与执行一个请求相关的操作,任何类都可能作为一个接收者。 /// </summary> public class Receiver { /// <summary> /// 真正的命令实现 /// </summary> public void Action() { Console.WriteLine("Execute request!"); } } /// <summary> /// 抽象命令类,用来声明执行操作的接口 /// </summary> public interface ICommand { void Execute(); } /// <summary> /// 具体命令类,实现具体命令。 /// </summary> public class ConcereteCommand : ICommand { // 具体命令类包含有一个接收者,将这个接收者对象绑定于一个动作 private Receiver receiver; public ConcereteCommand(Receiver receiver) { this.receiver = receiver; } /// <summary> /// 说这个实现是“虚”的,因为它是通过调用接收者相应的操作来实现Execute的 /// </summary> public void Execute() { receiver.Action(); } } /// <summary> /// 调度类,要求该命令执行这个请求 /// </summary> public class Invoker { private ICommand command; /// <summary> /// 设置命令 /// </summary> /// <param name="command"></param> public void SetCommand(ICommand command) { this.command = command; } /// <summary> /// 执行命令 /// </summary> public void ExecuteCommand() { command.Execute(); } }
class Program { static void Main(string[] args) { Receiver receiver = new Receiver(); ICommand command = new ConcereteCommand(receiver); Invoker invoker = new Invoker(); invoker.SetCommand(command); invoker.ExecuteCommand(); Console.Read(); } }
优点
1 解除了请求者与实现者之间的耦合,降低了系统的耦合度。
2 对请求排队或记录请求日志,支持撤销操作。
3 可以容易地设计一个组合命令。
4 新命令可以容易地加入到系统中。
缺点
1 因为针对每一个命令都需要设计一个具体命令类,使用命令模式可能会导致系统有过多的具体命令类。
时间: 2024-11-07 11:37:19