13 April 2014

Command -- Design Pattern

     Encapsulate a request as an object, thereby letting you parameterize clients with different requests, queue or log requests, and support undoable operations

Participants

  The classes and/or objects participating in this pattern are:
  • Command(Command)
       Declares an interface for executing an operation
  • Concrete Command(Calculator Command)
      Defines a binding between a Receiver object and an action

      Implements Execute by invoking the corresponding operation(s) on Receiver
  • Client(Command App)
      Creates a Concrete Command object and sets its receiver
  • Invoker(User)
       Asks the command to carry out the request
  • Receiver(Calculator)
      Knows how to perform the operations associated with carrying out the request.

Example of Comand Design Pattern


using System; 
namespace Command.Structural
{
  /// <summary>
  /// MainApp startup class for Structural
  /// Command Design Pattern.
  /// </summary>
  class MainApp
  {
    /// <summary>
    /// Entry point into console application.
    /// </summary>
    static void Main()
    {
      // Create receiver, command, and invoker
      Receiver receiver = new Receiver();
      Command command = new ConcreteCommand(receiver);
      Invoker invoker = new Invoker();

      // Set and execute command
      invoker.SetCommand(command);
      invoker.ExecuteCommand();

      // Wait for user
      Console.ReadKey();
    }
  }

  /// <summary>
  /// The 'Command' abstract class
  /// </summary>
  abstract class Command
  {
    protected Receiver receiver;

    // Constructor
    public Command(Receiver receiver)
    {
      this.receiver = receiver;
    }

    public abstract void Execute();
  }

  /// <summary>
  /// The 'ConcreteCommand' class
  /// </summary>
  class ConcreteCommand : Command
  {
    // Constructor
    public ConcreteCommand(Receiver receiver) :
      base(receiver)
    {
    }

    public override void Execute()
    {
      receiver.Action();
    }
  }

  /// <summary>
  /// The 'Receiver' class
  /// </summary>
  class Receiver
  {
    public void Action()
    {
      Console.WriteLine("Called Receiver.Action()");
    }
  } 
  /// <summary>
  /// The 'Invoker' class
  /// </summary>
  class Invoker
  {
    private Command _command;

    public void SetCommand(Command command)
    {
      this._command = command;
    }

    public void ExecuteCommand()
    {
      _command.Execute();
    }
  }
}

Output
Called Receiver.Action()


No comments:

Post a Comment