标签:
命令模式是:将一个请求封装为对象,从而使你可用不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可撤销的操作。
如何使用洗衣机:你使用洗衣机时,仅仅是去拧动按钮,就可以开始洗衣服了。不需知道如何让洗衣机去洗衣服,这就是典型的命令模式。即命令对象(洗衣服命令、脱水命令)并不知道如何处理命令,会有相应的接收者对象来执行命令(驱动器)。
本例子中:把洗衣服命令和脱水命令封装为对象;调用者Invoker的参数是不同的请求;调用者Invoker实施对请求的排队、记录、撤销等操作。而驱动器Driver才是真正执行操作的接收者,洗衣服命令和脱水命令调用驱动器的操作。
UML图:Driver是接收者,Command、WashCommand、DawaterCommand是命令对象,Invoker是调用者,相当于命令的集合。
相应代码:
//驱动器,真正执行命令的接收者 public class Driver { public void Wash() { Console.WriteLine("洗衣机开始洗衣服"); } public void Dawater() { Console.WriteLine("洗衣机开始脱水"); } } public abstract class Command { protected Driver driver; public Command(Driver driver) { this.driver = driver; } //以上确定参数,驱动器(Driver) 构造方法 abstract public void ExcuteCommand(); //抽象方法 } //洗衣服命令,调用驱动器的操作 class WashCommand:Command { public WashCommand(Driver driver) : base(driver) { } //参数和父类一样,子类的构造方法需要调用和父类一样的构造方法,用base关键字 public override void ExcuteCommand() { driver.Wash(); } } //脱水命令,调用驱动器的操作 class DawaterCommand : Command { public DawaterCommand(Driver driver) : base(driver) { } public override void ExcuteCommand() { driver.Dawater(); } } public class Invoker { private Command command; public void SetCommand(Command command) { this.command = command; } //构造方法,确定参数为Command;设置命令 public void ExecuteCommand() { command.ExcuteCommand(); } //调用Command的操作 }
//客户端 static void Main(string[] args) { Driver 驱动器 = new Driver(); //实例化,真正执行操作的驱动器 Command 洗衣服 = new WashCommand(驱动器); //实例化,具体的命令 Invoker 调用者 = new Invoker(); //实例化,调用者 调用者.SetCommand(洗衣服); //设置命令 调用者.ExecuteCommand();//执行命令
标签:
原文地址:http://blog.csdn.net/zhangmeihong2/article/details/43836809