[행위 패턴] Command pattern (커맨드 패턴)


요청을 객체로 감싼다.

 

( 원문 위치 : http://www.tutorialspoint.com/design_pattern/command_pattern.htm )

명령 패턴은 데이터 기반 디자인 패턴이며 행동 패턴 범주에 속합니다. 요청은 객체 아래에 명령으로 래핑되고 호출자 객체로 전달됩니다. Invoker 객체는이 명령을 처리 할 수있는 적절한 객체를 찾고 해당 객체에 명령을 전달하고 해당 객체는 명령을 실행합니다.

Implementation

명령으로써 동작하는 Order 인터페이스를 생성한다. 요청으로써 동작하는  Stock 클래스를 생성한다.  실제 명령 처리를 할 Order인터페이스를 구현하는 구체적인 명령 클래스  BuyStock과 SellStock를 만든다. Broker 클래스는 호출자로써 행동하도록 생성되었다. 이것은 명령을 받아서 명령할 수 있습니다.

브로커 객체는 명령 패턴을 사용하여 명령 유형에 따라 어떤 객체가 어떤 객체를 실행할지를 식별합니다. CommandPatternDemo, 데모 클래스는 브로커 클래스를 사용하여 명령 패턴을 보여줍니다.
Command Pattern UML Diagram

Step 1

command 인터페이스를 생성한다.

Order.java

public interface Order {
   void execute();
}

Step 2

요청(request)클래스를 생성한다.

Stock.java

public class Stock {
	
   private String name = "ABC";
   private int quantity = 10;

   public void buy(){
      System.out.println("Stock [ Name: "+name+", 
         Quantity: " + quantity +" ] bought");
   }
   public void sell(){
      System.out.println("Stock [ Name: "+name+", 
         Quantity: " + quantity +" ] sold");
   }
}

Step 3

Order 인터페이스를 구현하는 구체적인 클래스를 생성한다.

BuyStock.java

public class BuyStock implements Order {
   private Stock abcStock;

   public BuyStock(Stock abcStock){
      this.abcStock = abcStock;
   }

   public void execute() {
      abcStock.buy();
   }
}

SellStock.java

public class SellStock implements Order {
   private Stock abcStock;

   public SellStock(Stock abcStock){
      this.abcStock = abcStock;
   }

   public void execute() {
      abcStock.sell();
   }
}

Step 4

명령 호출자(invoker)를 생성한다.

Broker.java

import java.util.ArrayList;
import java.util.List;

   public class Broker {
   private List<Order> orderList = new ArrayList<Order>(); 

   public void takeOrder(Order order){
      orderList.add(order);		
   }

   public void placeOrders(){
   
      for (Order order : orderList) {
         order.execute();
      }
      orderList.clear();
   }
}

Step 5

명령을 수행하고 수신하기 위해 Broker클래스를 사용한다.

CommandPatternDemo.java

public class CommandPatternDemo {
   public static void main(String[] args) {
      Stock abcStock = new Stock();

      BuyStock buyStockOrder = new BuyStock(abcStock);
      SellStock sellStockOrder = new SellStock(abcStock);

      Broker broker = new Broker();
      broker.takeOrder(buyStockOrder);
      broker.takeOrder(sellStockOrder);

      broker.placeOrders();
   }
}

Step 6

결과를 확인한다.

Stock [ Name: ABC, Quantity: 10 ] bought
Stock [ Name: ABC, Quantity: 10 ] sold

 

Posted by kunoo
,