Command 패턴

Java Design Pattern 2013. 2. 19. 04:53

요청을 커맨드 객체로 캡슐화 하여 작업(Receiver 작업) 일반화시켜 요청의 종류와는 무관하게 프로그램 작성이 가능하게 만들어주는 패턴이다. 이때 요청에 매개변수를 써서 여러 가지 다른 요청 사항을 집어 넣을 수도 있다.

 

커맨드 객체는 일련의 행동을 특정 리시버와 연결시킴으로써 요청을 캡슐화 한다. 이때 매개 변수를 써서 여러가지 다른 요청 작업을 추가할 있다.(요청내역을 큐에 저장, 로그로 기록, 작업 취소 )

 

커맨드를 일반화 시키기 위하여  Command인터페이스를 구현한 커맨더들은 리시버와 결합하여 (외부로 노출된) 일반화된 커맨드 메소드( execute() ) 통해 요청내용을 캡슐화 한다.

 

참고 :

Receiver         : 전등(Light), 스테레오 라디오(Stereo)

Command      :  LivingroomLightOnCommand,  LivingroomLightOffCommand,  LightOnCommand,  LightOffCommand, StereoOnWithCDCommand, StereoOffCommand

 

 

 

다음코드는 커맨드들은 특정 리시버와 결함하여 요청 내용을 캡슐화 하므로써 Invoker  에서 실제작업이 무엇인지 관계없이 무관하게 작동 하도록 한다.

 

 

package headfirst.command;

 

public class CommandLoader {

 

       public static void main(String[] args) {

              Invoker invoker = new Invoker();

 

              // Receivers

              Light livingRoomLight = new Light("Living Room");

              Light alfrescoLight = new Light("Alfresco");

              Light kitchenLight = new Light("Kitchen");

              Stereo stereo = new Stereo("Living Room");

 

              // 아래의 커맨드 객체들은 일련의 행도을 특정 Receiver 연결시킴으로서 요구사항을 캡슐화 한다.

              LivingroomLightOnCommand livingRoomLightOn = new LivingroomLightOnCommand(livingRoomLight);

              LivingroomLightOffCommand livingRoomLightOff = new LivingroomLightOffCommand(livingRoomLight);

 

              LightOnCommand alfrescoLightOn = new LightOnCommand(alfrescoLight);

              LightOffCommand alfrescoLightOff = new LightOffCommand(alfrescoLight);

 

              LightOnCommand kitchenLightOn = new LightOnCommand(kitchenLight);

              LightOffCommand kitchenLightOff = new LightOffCommand(kitchenLight);

 

              StereoOnWithCDCommand stereoOnWithCD = new StereoOnWithCDCommand(stereo);

              StereoOffCommand stereoOff = new StereoOffCommand(stereo);

 

              invoker.setCommand(0, livingRoomLightOn, livingRoomLightOff);

              invoker.setCommand(1, alfrescoLightOn, alfrescoLightOff);

              invoker.setCommand(2, kitchenLightOn, kitchenLightOff);

              invoker.setCommand(3, stereoOnWithCD, stereoOff);

 

              System.out.println(invoker);

 

              // 캡슐화된 요청을 일관된 방법으로 처리한다.

              invoker.onButtonWasPushed(0);

              invoker.offButtonWasPushed(0);

              invoker.onButtonWasPushed(1);

              invoker.offButtonWasPushed(1);

              invoker.onButtonWasPushed(2);

              invoker.offButtonWasPushed(2);

              invoker.onButtonWasPushed(3);

              invoker.offButtonWasPushed(3);

       }

}

 

 

 

Command.java

CommandLoader.java

CommandPattern.ucls

Invoker.java

Light.java

LightOffCommand.java

LightOnCommand.java

LivingroomLightOffCommand.java

LivingroomLightOnCommand.java

NoCommand.java

Stereo.java

StereoOffCommand.java

StereoOnWithCDCommand.java

'Java Design Pattern' 카테고리의 다른 글

Strategy 패턴 - 알고리즘을 사용하는 클라이언트와 독립적으로 구현  (0) 2013.02.20
Facade 패턴  (0) 2013.02.19
Adapter 패턴  (0) 2013.02.19
Singleton 패턴  (0) 2013.02.19
객체지향 설계의 원칙  (0) 2013.02.19
Posted by Steven J.S Min
,