动机:
  在软件构建过程中,“行为请求者”与“行为实现者”通常呈现一种“紧耦合”。但在某些场合--比如需要对行为进行“记录、撤销/重做(Undo/Redo)、事务”等处理,这种无法抵御变化的紧耦合是不合适的。
  在这种情况下,如何将“行为请求者”与“行为实现解耦?将一组行为抽象为对象,可以实现二者之间的松耦合。
  
意图:
  将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化;对请求排队请求日志,以及支持可撤销的操作。
  出自:《设计模式》GoF

Command模式的几个要点:
  1、Command模式的根本目的在于将“行为请求者”与“行为实现者”解耦,在面向对象语言中,常见的实现手段是“将行为抽象为对象”。
  2、实现Command接口的具体对象ConcreteCommand有时候根据需要可能会保存一些额外的状态信息。
  3、通过使用Composite模式,可以将多个“命令”封装为一个“复合命令”MacroCommand。
  4、Command模式与C#中的Delegate有些类似。但两者定义行为接口的规范有所区别:Command以面向对象中的“接口-实现”来定义行为接口规范,更严格,更符合抽象原则;Delegate以函数签名来定义行为接口规范,更灵活,但抽象能力比较弱。

稳定部分:

    public interface Command
    
{
        
public void ShowText();
        
public void Undo();
        
public void Redo();
    }


变化部分:

    //行为实现者
    
//已经存在的对象,对这两个对象应用了Command设计模式之后可以,使得这两个对象和行为请求者解耦。
    class Document
    
{
        
public void ShowText()
        
{

        }


        
public void Undo()
        
{

        }


        
public void Redo()
        
{

        }

    }


    
class Graphics
    
{
        
public virtual void ShowText()
        
{

        }

        
public void Undo()
        
{

        }


        
public void Redo()
        
{

        }

    }


    
//下面来实现Command模式
    
//具体化的命令对象,从抽象意义来讲,CocumentCommand表示一个行为,这里与Document类依赖,使行为请求者与Document类解耦
    class DocumentCommand : Command
    
{
        Document document;
        
public DocumentCommand(Document doc)
        
{
            
this.document = doc;
        }


        
//注意接口的名字可以不一样
        public void Show()
        
{
            document.ShowText();
        }


        
public void Undo()
        
{
            
//可能要作一些状态处理
            document.Undo();
        }


        
public void Redo()
        
{
            
//可能要作一些状态处理
            document.Redo();    
        }

        
    }


    
class GraphicsCommand : Command
    
{
        Graphics Graphics;
        
public GraphicsCommand(Graphics Graphics)
        
{
            
this.Graphics = Graphics;
        }


        
public void Show()
        
{
            Graphics.ShowText();
        }

        
public void Undo()
        
{
            
//可能要作一些状态处理
            Graphics.Undo();
        }

        
public void Redo()
        
{
            
//可能要作一些状态处理
            Graphics.Redo();
        }

    }


主程序:

        //行为请求者
        
//Command模式使得行为请求者只与Command接口类依赖。而不和行为实现者依赖
        public void Show()
        
{
            Stack
<Command> stack;
            
foreach (Command c in stack)
            
{
                c.ShowText();
            }

        }


        
public void Undo()
        
{
            
if (canUndo)
            
{
                Command command 
= stactk.pop();
                command.Undo();

                undoList.Add(command);
            }

        }


        
public void Redo()
        
{
            
if (canRedo)
            
{
                Command command 
= undoList.pop();
                command.Redo();
            }

        }