Thứ Sáu, 26 tháng 4, 2013

Strategy

1. Khái niệm

Strategy pattern định nghĩa một họ các thuật toán, bao đóng từng thuật toán và làm cho chúng có thể hoán đổi cho nhau.

Strategy pattern khiến cho các thuật toán có thể thay đổi độc lập từ những client sử dụng nó.

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

Trong các bài học về thuật toán sắp xếp (sorting), chúng ta ít nhiều cũng đã nghe qua các thuật toán về sorting như: bubble sort, binarytree sort, merge sort...Mỗi thuật toán có cách xử lý khác nhau và cùng đưa về một kết quả giống nhau.

Làm thế nào để chúng ta có thể trình bày cách xử lý sắp xếp một chuỗi dữ liệu dạng List mà có thể vận dụng động các thuật toán như trên trong lập trình?

3. Giải pháp

Chúng ta có thể dùng Strategy pattern để giải quyết vấn đề trên.

Chúng ta có thể tạo ra một interface Sortable, trong đó định nghĩa 1 function sortList với giá trị trả về là một List đã được sort. Sau đó, chúng ta lần lượt tạo 3 class có tên BubbleSort, BinarytreeSort, MergeSort cùng implement interface trên. Khi client cần xử lý việc sortdata, chúng ta chỉ việc truyền vào interface để xử lý, khi đó chúng ta có thể dễ dàng thay đổi việc xử lý các logic sort khác nhau ngay cả trong quá trình runtime.

4. Mô hình




5. Code sample


public interface Sortable {
    public List<Integer> sortList(List<Integer> list);
}

public class BubbleSort implements Sortable{

    @Override
    public List<Integer> sortList(List<Integer> list) {
        List<Integer> result = new ArrayList<Integer>();
        //do bubble sort logic
        System.out.println("list has sorted using BubbleSort");
        return result;
    }
    
}

public class BinarytreeSort implements Sortable{

    @Override
    public List<Integer> sortList(List<Integer> list) {
        List<Integer> result = new ArrayList<Integer>();
        //do binary tree sort logic
        System.out.println("list has sorted using BinarytreeSort");
        return result;
    }
    
}

public class MergeSort implements Sortable{

    @Override
    public List<Integer> sortList(List<Integer> list) {
        List<Integer> result = new ArrayList<Integer>();
        //do merge sort logic
        System.out.println("list has sorted using MergeSort");
        return result;
    }
    
}

public class StrategyPattern {
    
    public static void main(String[] args){
        StrategyPattern pattern = new StrategyPattern();
        
        List<Integer> list = new ArrayList<Integer>();
        //assume put data into list
        
        list = pattern.doSort(new BubbleSort(), list);
        //list has sorted
    }
    
    
    public List<Integer> doSort(Sortable cal, List<Integer> list){
        return cal.sortList(list);
    }
    
}


6. Mối quan hệ với các pattern khác

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

Đăng nhận xét