设计模式学习笔记——命令模式(Command)
1.特点:将请求发送者与具体实现者解耦,可对请求排列、取消、重做,支持事务。(多请求,单处理)
2.概念:属于对象的行为模式【GOF95】。命令模式又称为行动(Action)模式或交易(Transaction)模式。命令模式把一个请求或者操作封装到一个对象中。命令模式允许系统使用不同的请求把客户端参数化,对请求排队或者记录请求日志,可以提供命令的撤销和恢复功能。
3.类图:
4、程序实现:
/// <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(); } }