[Tut 18 - Design Pattern] Command Pattern

Command Pattern là gì?

Command pattern là một mẫu thiết kế hướng dữ liệu và thuộc thể loại mô hình hành vi (behavioral pattern). Một yêu cầu được đóng gói trong một đối tượng là chỉ huy và truyền cho Invoker đối tượng. Đối tượng Invoker sẽ cho các đối tượng thích hợp có thể xử lý lệnh và chuyển lệnh cho các đối tượng tương ứng và đối tượng thực thi lệnh.



Step 1

Create a command interface.

Order.java

1
2
3
public interface Order {
   void execute();
}

Step 2

Create a request class.

Stock.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
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

Create concrete classes implementing the Order interface.

BuyStock.java

1
2
3
4
5
6
7
8
9
10
11
public class BuyStock implements Order {
   private Stock abcStock;
   public BuyStock(Stock abcStock){
      this.abcStock = abcStock;
   }
   public void execute() {
      abcStock.buy();
   }
}


SellStock.java


1
2
3
4
5
6
7
8
9
10
11
public class SellStock implements Order {
   private Stock abcStock;
   public SellStock(Stock abcStock){
      this.abcStock = abcStock;
   }
   public void execute() {
      abcStock.sell();
   }
}


Step 4

Create command invoker class.

Broker.java


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
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

Use the Broker class to take and execute commands.

CommandPatternDemo.java


1
2
3
4
5
6
7
8
9
10
11
12
13
14
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

Verify the output.

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

Nhận xét

Bài đăng phổ biến từ blog này

Base64 image – Lợi hay hại?

Hàm "tap" trong Laravel Collection