Thứ Năm, 2 tháng 5, 2013

Command

1. Khái niệm

Command pattern thực hiện việc đóng gói một request thành 1 object, do đó, nó cho phép chúng ta tham số hóa các client với những request khác nhau, thực hiện việc sắp xếp và lưu vết request, hỗ trợ khả năng phục hồi request cũ.

2. Vấn đề thực tế

Các function (hàm) trong ngôn ngữ lập trình thường thực hiện một hành vi nào đó với logic đã được định sẵn. Mỗi function có tên khác nhau và thực hiện các hành vi khác nhau. Làm thế nào chúng ta có thể gom các function đó thành 1 dạng tổng quát để có thể sử dụng trong việc kiểm soát các function được gọi, hoặc dùng queue các function đã gọi, hoặc bao đóng các logic xử lý của function để đơn giản nó trong việc triệu gọi?

3. Giải pháp

Command pattern ra đời để giúp chúng ta giải quyết vấn đề trên.

Điểm chính của command pattern chính là việc chuyển các request hay là các function thành dạng object. Khi chuyển thành dạng object, các object này có thể có một dạng chung nhất khi được triệu gọi, các object này được thể hiện dưới kiểu 1 interface command có 1 phương thức duy nhất là execute(). Các object này sẽ implement interface command để thực hiện phương thức execute(). Tùy mỗi object sẽ thực hiện một chức năng riêng được khai báo trong nội dung của phương thức execute(). Khi object được triệu gọi, nó chỉ cần thực hiện phương thức execute(), khi đó các logic nội tại của object đã được định sẵn trong execute() sẽ thực thi.

Việc chuyển các function sang dạng object sẽ giúp dễ dàng trong việc chia sẻ, lưu trữ, thao tác. Các object khi thực thi phương thức execute() cũng có thể được lưu lại trong queue để phục vụ cho các mục đích khác.

4. Mô hình




5. Code sample


public interface Commandable {
    public void execute();
}



public class StockDto {
    //info about stock
}



public class StockService {
    public void buyStockOrder(StockDto stock){
        //execute buy stock logic
    }
    
    public void offerStockOrder(StockDto stock){
        //execute offer stock logic
    }
    
    public void cancelOrder(String orderid){
        //execute cancel stock logic
    }
}



public class BuyOrder implements Commandable{
    StockService service = new StockService();
    StockDto _StockDto;
    
    public BuyOrder(StockDto stock){
        _StockDto = stock;
    }

    @Override
    public void execute() {
        System.out.println("place BuyOrder");
        service.buyStockOrder(_StockDto);
    } 
}



public class OfferOrder implements Commandable{
    StockService service = new StockService();
    StockDto _StockDto;
    
    public OfferOrder(StockDto stock){
        _StockDto = stock;
    }

    @Override
    public void execute() {
        System.out.println("place OfferOrder");
        service.offerStockOrder(_StockDto);
    }
}



public class CancelOrder implements Commandable{
    StockService service = new StockService();
    String _OrderId;
    
    public CancelOrder(String orderid){
        _OrderId = orderid;
    }

    @Override
    public void execute() {
        System.out.println("place CancelOrder");
        service.cancelOrder(_OrderId);
    }
}



public class Broker {
    public static List<Commandable> orderqueue = new ArrayList<Commandable>();
    
    public void placeOrder(Commandable order){
        order.execute();
        orderqueue.add(order);
    }
}



public class CommandPattern {
    public static void main(String[] args){
        StockDto stock1 = new StockDto();
        StockDto stock2 = new StockDto();
        
        BuyOrder buyorder = new BuyOrder(stock1);
        OfferOrder offerorder = new OfferOrder(stock2);
        CancelOrder cancelorder = new CancelOrder("orderid_00001");
        
        Broker broker = new Broker();
        broker.placeOrder(buyorder);
        broker.placeOrder(offerorder);
        broker.placeOrder(cancelorder);
    }
}


6. Mối liên hệ với các pattern khác

Không có nhận xét nào:

Đăng nhận xét