[Design Patterns] Command Pattern

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

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

sơ đồ các class

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ó BuyingSelling 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 BuyingSelling.

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

Bài viết liên quan

9 Mẹo lập trình Web “ẩn mình” giúp tiết kiệm hàng giờ đồng hồ

Hầu hết các lập trình viên (kể cả những người giỏi) đều tốn thời gian x

Can GPT-4o Generate Images? All You Need to Know about GPT-4o-image

OpenAI‘s GPT-4o, introduced on March 25, 2025, has revolutionized the way we create visual con

Khi nào nên dùng main, section, article, header, footer, và aside trong HTML5

HTML5 đã giới thiệu các thẻ ngữ nghĩa giúp cấu trúc nội dung web một cách có

So sánh Webhook và API: Khi nào nên sử dụng?

Trong lĩnh vực công nghệ thông tin và phát triển phần mềm, Webhook và API là hai th