Command

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

اين Pattern همچنين به نامهاي Action يا Transaction نيز شناخته مي شود.

Command در واقع يک Object است که همه اطلاعات لازم براي اجراي يک درخواست (فرخواني يک متد) در آن Encapsulate شده است.

Command مستقل از کلاسي است که درخواست اجراي آن را کرده است (Client).

همچنين در اين Pattern جزئيات اجراي Commant از ديد Client پنهان است.

موارد استفاده Command Pattern:

1-پياده سازي Undo
مي توان Command هاي اجرا شده را در يک Stack قرار داد و در صورت لزوم و به درخواست کاربر Undo نمود.
2-رفتار Transactional
در مورد دستورات جداگانه اما وابسته که با Fail شدن يکي، کل عمليات بايد Rollback گردد. مشابه Undo بايد دستورات اجرا شده را در ليستي نگهداري کرد تا در زمان Rollback احتمالي مورد استفاده قرار گيرد.
3-پياده سازي Wizard
4-پياده سازي Progress Bar
5-فراخواني يک دستور به چند روش
مثلا در GUI ها که يک دستور ممکن است با کليک يک دکمه يا يک shortcut و غيره اجرا شود.

که در اين دياگرام…

Client: نمونه ConcreteCommand را ايجاد مي کند و receiver آن را مقداردهي مي‌نمايد.

Invoker: دستور اجراي Command را در زمان مناسب صادر مي کند. معمولا ليست Command ها را جهت اجرا نگهداري مي نمايد. بطور کلي وظيفه اش مديريت اجراي Command ها است.

Receiver: جزئيات پياده سازي اجراي Command در اين کلاس پياده شده است. هر Command بايد refernce به receiver مناسب خود را نگه دارد.


نمونه کد:

/*the Command interface*/
public interface Command {
   void execute();
}


/*the Invoker class*/
public class Switch {

   private List history = new ArrayList();

   public void storeAndExecute(Command cmd) {
      this.history.add(cmd); // optional
      cmd.execute();
   }
}


/*the Receiver class*/
public class Light {

   public void turnOn() {
      System.out.println(“The light is on”);
   }

   public void turnOff() {
      System.out.println(“The light is off”);
   }
}


/*the Command for turning on the light – ConcreteCommand #1*/
public class FlipUpCommand implements Command {

   private Light theLight;

   public FlipUpCommand(Light light) {
      this.theLight = light;
   }

   public void execute(){
      theLight.turnOn();
   }
}


/*the Command for turning off the light – ConcreteCommand #2*/
public class FlipDownCommand implements Command {

private Light theLight;

   public FlipDownCommand(Light light) {
      this.theLight = light;
   }

   public void execute() {
      theLight.turnOff();
   }
}


public static void main(String[] args){
   Light lamp = new Light();
   Command switchUp = new FlipUpCommand(lamp);
   Command switchDown = new FlipDownCommand(lamp);

   Switch s = new Switch();

   if (args[0].equalsIgnoreCase(“ON”)) {
      s.storeAndExecute(switchUp);
   } else {
      s.storeAndExecute(switchDown);
   }
}

در صورت لزوم مي توان Command ها را با Composite Pattern به هم متصل کرد.


تفاوت Command Design Pattern و Strategy Design Pattern:
Strategy الگوريتم هاي گوناگون اجراي يک کار بخصوص را درخود نگه مي دارد.
اما Command حاوي الگوريتم کار نيست، بلکه فراخواني يک دستور را درقالب يک Object در خود encapsulate مي‌کند. اين کار امکان مي‌دهد که دستور اجراي يک کار را بتوان بين Object هاي ديگر انتقال داد و از راه ها و در زمان هاي مختلف آن را اجرا نمود.



منبع ها:

  1. Design Patterns – Elements of Reusable Object Oriented Software (GOF) By Erich Gamma, Richard Helm, Ralph Johnson, John Vlissides
  2. Command in Wikipedia
  3. Command in Devlake

پست شده در دسته‌بندی نشده

پاسخ دهید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

*


نُه − 8 =

شما می‌توانید از این دستورات HTML استفاده کنید: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

تماس با من: admin@paspars.com