명령 모드


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


소개

의도: 요청을 객체로 캡슐화하여 다양한 요청으로 클라이언트를 매개변수화할 수 있습니다.

주요 솔루션: 소프트웨어 시스템에서 동작 요청자와 동작 구현자는 일반적으로 긴밀하게 결합된 관계를 갖지만, 동작을 기록해야 하거나 실행 취소 또는 다시 실행해야 하는 경우, 트랜잭션 등의 경우에는 이러한 종류의 긴밀하게 결합됩니다. 변화에 저항하지 못하는 디자인은 적합하지 않습니다.

사용 시기: "기록, 실행 취소/다시 실행, 트랜잭션" 및 기타 동작 처리와 같은 일부 상황에서는 변경을 거부할 수 없는 이러한 유형의 긴밀한 결합은 부적절합니다. 이 경우 "행동 요청자"와 "행동 구현자"를 분리하는 방법은 무엇입니까? 일련의 동작을 개체로 추상화하면 동작 간의 느슨한 결합을 달성할 수 있습니다.

해결 방법: 발신자를 통해 수신자를 호출하여 명령을 실행합니다. 순서는 발신자 → 수신자 → 명령입니다.

키 코드: 세 가지 역할 정의: 1. 수신된 실제 명령 실행 개체 2. 명령 3. 호출자는 명령 개체의 입구를 사용합니다.

응용 예: 스트럿츠에는 액션 코어 컨트롤러 ActionServlet이 하나만 있습니다. 이는 Invoker와 동일하며 모델 계층 클래스는 특정 명령과 동일하며 애플리케이션이 다른 다양한 모델 클래스를 갖습니다.

장점: 1. 시스템 결합을 줄입니다. 2. 새로운 명령을 시스템에 쉽게 추가할 수 있습니다.

단점: 명령 모드를 사용하면 일부 시스템에 특정 명령 클래스가 너무 많아질 수 있습니다.

사용 시나리오: 명령 모드는 다음과 같이 명령이 고려되는 모든 곳에서 사용할 수 있습니다. 1. GUI의 모든 버튼은 명령입니다. 2. CMD를 시뮬레이션합니다.

참고: 시스템은 명령의 실행 취소(Undo) 작업 및 복구(Redo) 작업을 지원해야 합니다. 명령 모드의 확장을 참조하세요.

Implementation

먼저 인터페이스 Order를 명령으로 생성한 다음 Stock 클래스를 요청으로 생성합니다. 엔터티 명령 클래스 BuyStockSellStockOrder 인터페이스를 구현하고 실제 명령 처리를 수행합니다. 주문을 받고 주문할 수 있는 호출 개체로 Broker 클래스를 만듭니다.

Broker 개체는 명령 패턴을 사용하여 명령 유형에 따라 어떤 개체가 어떤 명령을 실행하는지 결정합니다. CommandPatternDemo, 데모 클래스에서는 Broker 클래스를 사용하여 명령 패턴을 보여줍니다.

command_pattern_uml_diagram.jpg

1단계

명령 인터페이스를 만듭니다.

Order.java

public interface Order {
   void execute();
}

2단계

요청 클래스를 생성합니다.

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");
   }
}

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();
   }
}

4단계

명령 호출 클래스를 생성합니다.

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();
   }
}

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();
   }
}

6단계

출력을 확인합니다.

rreee