一.介绍
命令模式(Command Pattern)。属于行为型模式。它将请求封装成一个对象,从而使你可以用不同的请求对客户端进行参数化;对请求排队或记录请求日志,以及支持可撤销的操作。
二.实现
举个例子,老板想做一个系统,那老板的话就相当于一个命令,而这个命令又不可能直接说给员工(老板一般都是神龙见首不见尾,不直接跟员工发号施令),这就需要让经理去发出命令,并且监督员工执行该命令。这个场景下,老板的话就是命令Command,经理是请求者Invoker,员工是接受者Receiver。
//命令Command public abstract class Boss { public abstract void Execute(); } //接受者Receiver public class Staff { public void Action() { Console.WriteLine("干活"); } } //请求者Invoker public class Manager { private Boss boss; public void SetCommand(Boss boss) { this.boss = boss; } public void ExecuteCommand(string client) { Console.WriteLine(client); Console.WriteLine("延迟5秒执行"); boss.Execute(); } } //具体命令Command public class BossA : Boss { private Staff staff; public BossA(Staff staff) { this.staff = staff; } public override void Execute() { staff.Action(); } } //具体命令Command public class BossB : Boss { private Staff staff; public BossB(Staff staff) { this.staff = staff; } public override void Execute() { staff.Action(); } } //调用 public static void Main(string[] args) { Manager manager = new Manager(); manager.SetCommand(new BossA(new Staff())); manager.ExecuteCommand("做老板A的项目"); manager.SetCommand(new BossB(new Staff())); manager.ExecuteCommand("做老板B的项目"); }
这个例子较为简单,想做可以设置多个命令的操作,将命令改为集合,并对其做删改操作就行。
三.总结
优点:
1.使得新的命令很容易加入到系统中。
2.可以设计一个命令队列来实现对请求的 Updo 和 Redo 操作。
3.可以较容易地将命令写入日志。
4.可以将命令对象聚合起来,合成命令。
缺点:
1.可能会导致系统有过多的具体命令类。