[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

WebP là gì? Hướng dẫn cách để chuyển hình ảnh jpg, png qua webp

WebP là gì? WebP là một định dạng ảnh hiện đại, được phát triển bởi Google

Điểm khác biệt giữa IPv4 và IPv6 là gì?

IPv4 và IPv6 là hai phiên bản của hệ thống địa chỉ Giao thức Internet (IP). IP l

Check nameservers của tên miền xem website trỏ đúng chưa

Tìm hiểu cách check nameservers của tên miền để xác định tên miền đó đang dùn

Mình đang dùng Google Domains để check tên miền hàng ngày

Từ khi thông báo dịch vụ Google Domains bỏ mác Beta, mình mới để ý và bắt đầ