标签:public rri err receive key ati 来源 count 维护
C#命令模式 图片来源<设计模式之禅>
按上图所示 Receiver是实际干活的实现代码就在这个模块中 , Command 是抽象父类,ConcreteCommand是继承Command的类型 抽象的父类中含有Receiver类 用于子类调用其方法,即子类的Execute就是调用的Receiver中实际代码,Invoker就是为了维护
comand方法
实际代码如下图
1 /// <summary> 2 /// 实现类 3 /// </summary> 4 public class Barbecuer 5 { 6 7 public void BakeMutton() 8 { 9 10 Console.WriteLine("烤羊肉串"); 11 } 12 13 public void BakeChickenWing() 14 { 15 16 Console.WriteLine("烤鸡翅"); 17 } 18 }
实现类即 Receiver 代码
//实际代码 public abstract class Command { //实现代码的类 protected Barbecuer receiver; public Command(Barbecuer receiver) { this.receiver = receiver; } //实现的方法 abstract public void ExcuteCommand(); } public class BakeChickenWingCommand : Command { public BakeChickenWingCommand(Barbecuer receiver) : base(receiver) { } public override void ExcuteCommand() { receiver.BakeChickenWing(); } } public class BakeMuttonCommand : Command { public BakeMuttonCommand(Barbecuer receiver) : base(receiver) { } public override void ExcuteCommand() { receiver.BakeMutton(); } }
上面为父类与子类 即Command ,ConcreteCommand 模块
再来就是维护类 用于维护command方法
public class Waiter { Queue<Command> queue = new Queue<Command>(); public void SetCommand(Command command) { queue.Enqueue(command); } public void Notify() { while (queue.Count > 0) { Command command = queue.Dequeue(); command.ExcuteCommand(); } } }
后面调用代码
class Program { static void Main(string[] args) { //生成维护的类 Waiter waiter = new Waiter(); //真正实现代码的类 Barbecuer barecuer = new Barbecuer(); //传入到执行类里面去 Command commandwing = new BakeChickenWingCommand(barecuer); //传入执行的子类 让子类执行代码 waiter.SetCommand(commandwing); waiter.SetCommand(commandwing); waiter.SetCommand(commandwing); waiter.Notify(); Command command = new BakeMuttonCommand(barecuer); waiter.SetCommand(command); waiter.SetCommand(command); waiter.Notify(); Console.ReadKey(); } }
命令模式 用出就是维护命令的列队,有需要的时候就把命令加入日志,支持撤销与重做 撤销就要在waiter 类 即Invoker模块中进行维护判断是否把command中的某个子类加入到执行列表中
标签:public rri err receive key ati 来源 count 维护
原文地址:http://www.cnblogs.com/yangshasha/p/7615079.html