一,什么是命令模式(Command Pattern)?
命令模式:将请求封装成命令对象,请求的具体执行由命令接收者执行;
二,如下代码
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace _14.命令模式 { //命令模式的本质是对命令进行封装,将发出命令的责任和执行命令的责任分割开。 //在软件系统中,行为请求者与行为实现者通常是一种紧耦合的关系,但某些场合,比如需要对行为进行记录、撤销或重做、事务等处理时,这种无法抵御变化的紧耦合的设计就不太合适。 /// <summary> /// 客户端是命令发起方 /// </summary> class Program { static void Main(string[] args) { Event u = new SleepEvent(new JanReceiver()); Event j = new EatEvent(new JanReceiver()); Chinese ch = new Chinese(); ch.AddEvent(u); ch.AddEvent(j); ch.ExecuteEvent(); } } /// <summary> /// 中国人接收到命令,负责调用 /// </summary> public class Chinese { private List<Event> list = new List<Event>(); public void AddEvent(Event en) { list.Add(en); } public void ExecuteEvent() { Console.WriteLine("快去吃饭和睡觉"); foreach (var item in list) { item.Execute(); } } } /// <summary> /// 将命令事件抽象 /// </summary> public abstract class Event { public abstract void Execute(); } /// <summary> /// 执行实际的命令处理的对象 /// </summary> public class SleepEvent : Event { private JanReceiver _janEvent { get; set; } public SleepEvent(JanReceiver relation) { this._janEvent = relation; } public override void Execute() { this._janEvent.SleepEvent(); //在这里选择可以对Sleep行为,进行记录、撤销或重做、事务等处理该命令 } } /// <summary> /// 执行实际的命令处理的对象 /// </summary> public class EatEvent : Event { private JanReceiver _JanEvent { get; set; } public EatEvent(JanReceiver relation) { this._JanEvent = relation; } public override void Execute() { this._JanEvent.EatEvent(); //在这里选择可以对Eat行为,进行记录、撤销或重做、事务等处理该命令 } } public class JanReceiver { public void EatEvent() { Console.WriteLine("日本人吃饭"); } public void SleepEvent() { Console.WriteLine("日本人睡觉"); } } }
三,根据命令模式我们分为下面几个角色,
抽象命令 :Event
具体命令:EatEvent,SayEvent
命令接收者:执行命令(JanReceiver)
命令调用者:(Chinese)
客户端:发送命令
四,在命令模式中,我们将客户端发送的指令封装成一个对象,如我们的吃和睡觉指令,我们将这两个行为以命令的形式包裹在一个对象中,然后传递给命令接受者执行命令,而这里调用者角色与接收者角色之间没有任何依赖关系,调用者实现功能时只需调用Chinese抽象类的execute方法就可以,实现命令的调用