using System; namespace ConsoleApplication8 { class Program { /// <summary> /// 在软件系统中,“行为请求者”与“行为实现者”通常呈现一种“紧耦合”。 /// 但在某些场合,比如要对行为进行“记录、撤销/重做、事务”等处理,这种无法抵御变化的紧耦合是不合适的。 /// 在这种情况下,如何将“行为请求者”与“行为实现者”解耦?将一组行为抽象为对象,可以实现二者之间的松耦合[李建忠]。 /// 这就是本文要说的Command模式。 /// </summary> /// <param name="args"></param> static void Main(string[] args) { Document doc = new Document(); doc.Display(); doc.Undo(); doc.Redo(); Console.Read(); } /// <summary> /// 文档类 /// </summary> public class Document { /// <summary> /// 显示操作 /// </summary> public void Display() { Console.WriteLine("Display"); } /// <summary> /// 撤销操作 /// </summary> public void Undo() { Console.WriteLine("Undo"); } /// <summary> /// 恢复操作 /// </summary> public void Redo() { Console.WriteLine("Redo"); } } /// <summary> /// 抽象命令 /// </summary> public abstract class DocumentCommand { public Document _document; public DocumentCommand(Document doc) { this._document = doc; } /// <summary> /// 执行 /// </summary> public abstract void Execute(); } /// <summary> /// 显示命令 /// </summary> public class DisplayCommand : DocumentCommand { public DisplayCommand(Document doc) : base(doc) { } public override void Execute() { _document.Display(); } } /// <summary> /// 撤销命令 /// </summary> public class UndoCommand : DocumentCommand { public UndoCommand(Document doc) : base(doc) { } public override void Execute() { _document.Undo(); } } /// <summary> /// 重做命令 /// </summary> public class RedoCommand : DocumentCommand { public RedoCommand(Document doc) : base(doc) { } public override void Execute() { _document.Redo(); } } /// <summary> /// Invoker角色 /// </summary> public class DocumentInvoker { DocumentCommand _discmd; DocumentCommand _undcmd; DocumentCommand _redcmd; public DocumentInvoker(DocumentCommand discmd, DocumentCommand undcmd, DocumentCommand redcmd) { this._discmd = discmd; this._undcmd = undcmd; this._redcmd = redcmd; } public void Display() { _discmd.Execute(); } public void Undo() { _undcmd.Execute(); } public void Redo() { _redcmd.Execute(); } } } }