Command là một dạng thức triển khai data driven được xếp vào nhóm các pattern Hành Vi.
Trong Command, một yêu cầu được đóng gói ở dạng 1 object mô tả mệnh lệnh và được truyền
tới object thực thi mệnh lệnh. Object thực thi sẽ tìm kiếm một object phù hợp có thể thực hiện
được yêu cầu và ủy thác lại mệnh lệnh đó.
Áp dụng triển khai
Chúng ta có một abstract Order
đóng vai trò mô tả mệnh lệnh. Class Stock
được tạo ra với
vai trò là yêu cầu xử lý. Kế đến là chúng ta có Buying
và Selling
là các mệnh lệnh thực tế.
Class Broker
đóng vai trò là object thực thi có thể nhận và xử lý mệnh lệnh.
Broker
sẽ sử dụng command pattern để tìm kiếm object phù hợp để thực thi mệnh lệnh
tùy thuộc vào kiểu của từng object Order.
Bước 1
Tạo class Stock
đóng vai trò là yêu cầu xử lý.
commandpattern/Stock.java
packagecommandpattern;publicclassStock{privateString name ="ABC";privateint quantity =10;publicvoidbuy(){System.out.println("Stock [ Name: "+ name +", quantity: "+ quantity +" ] bought");}publicvoidsell(){System.out.println("Stock [ Name: "+ name +", quantity: "+ quantity +" ] sold");}}
Bước 2
Tạo abstract Order
.
commandpattern/Order.java
packagecommandpattern;publicabstractclassOrder{protectedStock stock;publicOrder(Stock stock){this.stock = stock;}publicabstractvoidexecute();}
Bước 3
Tạo các class command Buying
và Selling
.
commandpattern/Buying.java
packagecommandpattern;publicclassBuyingextendsOrder{publicBuying(Stock stock){super(stock);}@Overridepublicvoidexecute(){
stock.buy();}}
commandpattern/Selling.java
packagecommandpattern;publicclassSellingextendsOrder{publicSelling(Stock stock){super(stock);}@Overridepublicvoidexecute(){
stock.sell();}}
Bước 4
Tạo class thực thi command Broker
.
commandpattern/Broker.java
packagecommandpattern;importjava.util.ArrayList;importjava.util.List;publicclassBroker{privateList<Order> orderList =newArrayList<Order>();publicvoidtakeOrder(Order o){
orderList.add(o);}publicvoidplaceOrders(){for(Order o : orderList){ o.execute();}
orderList.clear();}}
Bước 5
Sử dụng Broker
để nhận và xử lý các yêu cầu.
PatternDemo.java
importcommandpattern.Broker;importcommandpattern.Buying;importcommandpattern.Selling;importcommandpattern.Stock;publicclassPatternDemo{publicstaticvoidmain(String[] args){Stock abc =newStock();Broker b =newBroker();Buying buyOrder =newBuying(abc);
b.takeOrder(buyOrder);Selling sellOrder =newSelling(abc);
b.takeOrder(sellOrder);// các yêu cầu được thực hiện tại đây
b.placeOrders();}}
Bước 6
Kiểm chứng lại kết quả được in ra ở console
.
console
Stock[Name: ABC, quantity:10] bought
Stock[Name: ABC, quantity:10] sold
Nguồn: viblo.asia