命令模式是对命令的封装,目的就是要把发出命令和执行命令分割开来。
以下的例子,用校长发送命令给学生来来说明命令发送的整个过程,其中老师作为命令的中转站必不可少。
using System; using System.Collections; using System.Collections.Generic; using System.Linq; namespace ConsoleApplication1 { class Program { /// <summary> /// 命令接受者学生接口 /// </summary> public abstract class Student { public abstract void Action(); } /// <summary> /// 命令接受者学生A /// </summary> public class StudentA : Student { public override void Action() { Console.WriteLine("StudentA do the action"); } } /// <summary> /// 命令接受者学生B /// </summary> public class StudentB : Student { public override void Action() { Console.WriteLine("StudentB do the action"); } } /// <summary> /// 命令抽象类 /// </summary> public abstract class Command { protected Student student; public Command(Student student) { this.student = student; } public abstract void Execute(); } /// <summary> /// 具体命令 /// </summary> public class ConcreteCommand : Command { public ConcreteCommand(Student student) : base(student) { } public override void Execute() { student.Action(); } } /// <summary> /// 命令请求者 /// </summary> public class Teacher { private Command command; public void SetCommand(Command command) { this.command = command; } public void ExecuteCommand() { command.Execute(); } } /// <summary> /// 客户端 如校长 /// </summary> /// <param name="args"></param> static void Main(string[] args) { StudentA sa = new StudentA(); StudentB sb = new StudentB(); Command c1 = new ConcreteCommand(sa); Command c2 = new ConcreteCommand(sb); Teacher teacher = new Teacher(); teacher.SetCommand(c1); teacher.ExecuteCommand(); teacher.SetCommand(c2); teacher.ExecuteCommand(); } } }
如果要执行一串命令可以用list数据结构进行封装。
using System; using System.Collections; using System.Collections.Generic; using System.Linq; namespace ConsoleApplication1 { class Program { /// <summary> /// 命令接受者学生接口 /// </summary> public abstract class Student { public abstract void Action(); } /// <summary> /// 命令接受者学生A /// </summary> public class StudentA : Student { public override void Action() { Console.WriteLine("StudentA do the action"); } } /// <summary> /// 命令接受者学生B /// </summary> public class StudentB : Student { public override void Action() { Console.WriteLine("StudentB do the action"); } } /// <summary> /// 命令抽象类 /// </summary> public abstract class Command { protected Student student; public Command(Student student) { this.student = student; } public abstract void Execute(); } /// <summary> /// 具体命令 /// </summary> public class ConcreteCommand : Command { public ConcreteCommand(Student student) : base(student) { } public override void Execute() { student.Action(); } } /// <summary> /// 命令请求者 /// </summary> public class Teacher { private List<Command> command; public void SetCommand(List<Command> command) { this.command = command; } public void ExecuteCommand() { foreach (var c in command) { c.Execute(); } } } /// <summary> /// 客户端 如校长 /// </summary> /// <param name="args"></param> static void Main(string[] args) { StudentA sa = new StudentA(); StudentB sb = new StudentB(); Command c1 = new ConcreteCommand(sa); Command c2 = new ConcreteCommand(sb); List<Command> command = new List<Command>(); command.Add(c1); command.Add(c2); Teacher teacher = new Teacher(); teacher.SetCommand(command); teacher.ExecuteCommand(); } } }