본문 바로가기

디자인 패턴

디자인패턴 : Command


명령 디자인패턴

- 요청 자체를 캡슐화하는 것이다.  이를 통해 요청이 서로 다른 사용자를 매개변수로 만들고, 요청을 대기시키거나 로깅하며, 되돌릴 수 있는 연산을 지원한다.

클래스설명

 커맨드패턴은 다음과 같은 일을 하고자 할때 주로 사용된다.

1. 수행할 동작을 객체로 매개변수화하고자 할 때 사용한다. 절차지향 프로그램에서는 이를 콜백함수, 즉 어딘가 등록되었다가 나중에 호출되는 함수를 사용해서 이러한 매개변수화를 표현할 수 있다. 커맨드패턴은 콜백을 객체지향 방식으로 나타낸 것이다.

2. 서로 다른 시간에 요청을 명시하고 저장하며, 실행하고 싶을 때, 커맨드객체는 원래의 요청과 다른 생명주기가 있다. 요청을 받아 처리하는 객체가 주소 지정 방식과는 독립적으로 표현될 수 있다면, 커맨드 객체를 다른 프로세스에게 넘겨주고 거기서 해당 처리를 진행하게 할 수 있다.

3. 실행 취소 기능을 지원하고 싶을 때.
4. 시스템이 고장 났을 때 재적용이 가능하도록 변경 과정에 대한 로깅을 지원하고 싶을 때.
5. 기본적인 연산의 조합으로 만든 상위 수준 연산을 써서 시스템을 구조화하고 싶을 때.

클래스 사용방법

var remote: CommandUser = new CommandUser();
var car: Car = new Car();
var carCommand: CarCommand = new CarCommand(car);

remote.setCommand( carCommand );
remote.press();

클래스 구성
 

- 캡슐화되는 클래스는 반드시 Command 인터페이스를 상속받아야 한다. 

package
{
     public interface Commend
     {
          function execute(): void;
     }


// 자동차를 움직이기 위한 커맨드클래스
package
{
     public class CarCommand implements Commend
     {
          private var car: Car;       

          public function CarCommand(c:Car)
          {
               this.car = c;
          }
          public function execute(): void
          {
               car.accelerator();
          }
     }


// 소스클래스
package
{
     public class Car extends Sprite
     {
          public function Car()
          {
                // 구현 생략
          }
          public function accelerator(): void
          {
               // 구현 생략
          }
     }
}

//커맨드클래스 구현
package
{
     public class CommandUser
     {
          private var slot: Command; 

          public function Command(c: Command)
          {
               slot = c;
          }
          public function setCommand(c: Command): void
          {
               slot = c;
          }
          public function press(): void
          {
               slot.execute();
          }
     }
}

'디자인 패턴' 카테고리의 다른 글

디자인패턴 : Observer  (0) 2011.08.03
디자인패턴 : Singleton  (0) 2011.08.03
디자인패턴 : Composite  (0) 2011.08.03
디자인패턴 : Iterator  (0) 2011.08.03
디자인패턴 : State  (0) 2011.08.03