반응형

Design Patterns - Command Pattern


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

** 먹구살려다보니 한참 포스팅을 못했다...ㅠㅠ 에혀..그래도 짬짬이 해햐 하는데...

Command pattern은 데이터 기반 디자인 패턴(Data driven desing pattern)이고 핻옫적(behavioral) 패턴 범주에 포함된다. 요청(request)은 명령(Command)으로써 객체에 싸여지고(Wrapped) 호출(invoker)객체에 전달된다. 호출객체는 이 명령을 다룰 수 있는 적절한 객체를 찾고 그 명령을 실행하는 객체로 전달한다.

Implementation

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

Broker 객체는 명령 타입에 기초한 명령을 수행할 객체를 식별하기 위해 명령 패턴을 사용한다. CommandPatternDemo, 데모 클래스는 명령 패턴을 보이기 위해 Broker클래스를 사용할 것이다.
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


반응형

+ Recent posts