Monday, December 11, 2006

Implementing Strategy Pattern in Java

The previous post described the Strategy pattern in brief. I listed out where and why the strategy pattern may be used. This post describes how to implement command pattern in Java and also some implementation considerations. This example here uses sorting algorithms. Two sorting algorithms (Bubble sort and Quick sort) are implemented and the client can select either the algorithms. Here is the UML diagram for the Strategy Pattern.Strategy Pattern UMLThe following is a simple description of each of the elements of the above diagram, followed by a simple implementation.
  • Strategy: This is an interface to describe the individual algorithms.
    public interface SortInterface {
    public void sort(double[] list);
    }
    SortInterface.java
  • ConcreteStrategy: Implements Strategy Interface and contains the logic for the algorithm.
    public class QuickSort implements SortInterface {
    public void sort(double[] a) {
    quicksort(a, 0, a.length - 1);
    }
    private void quicksort(double[] a, int left, int right) {
    if (right <= left) return;
    int i = partition(a, left, right);
    quicksort(a, left, i-1);
    quicksort(a, i+1, right);
    }

    private int partition(double[] a, int left, int right) {
    int i = left;
    int j = right;
    while (true) {
    while (a[i]< a[right])
    i++;
    while (less(a[right], a[--j]))
    if (j == left) break;
    if (i >= j) break;
    exch(a, i, j);
    }
    exch(a, i, right);
    return i;
    }

    private boolean less(double x, double y) {
    return (x < y);
    }

    private void exch(double[] a, int i, int j) {
    double swap = a[i];
    a[i] = a[j];
    a[j] = swap;
    }
    }
    QuickSort.java
    public class BubbleSort implements SortInterface {
    public void sort(double[] list) {
    double temp;
    for(int i = 0; i < list.length; i++) {
    for(int j = 0; j < list.length - i; j++) {
    if(list[i] < list[j]) {
    temp = list[i];
    list[i] = list[j];
    list[j] = temp;
    }
    }
    }
    }
    }
    BubbleSort.java
  • Context: The context maintains a reference to a Strategy object and forwards client requests to the strategy. Context may also define an interface to let Strategies access context data.
    public class SortingContext {
    private SortInterface sorter = null;

    public void sortDouble(double[] list) {
    sorter.sort(list);
    }

    public SortInterface getSorter() {
    return sorter;
    }

    public void setSorter(SortInterface sorter) {
    this.sorter = sorter;
    }
    }
    SortingContext.java
  • Client: The client sets the concrete strategy in the context and invokes the context to run the algorithm. You can also have the context set the Concrete strategy implementation itself, based on the request.
    public class SortingClient {
    public class SortingClient {
    public static void main(String[] args) {
    double[] list = {1,2.4,7.9,3.2,1.2,0.2,10.2,22.5,19.6,14,12,16,17};
    SortingContext context = new SortingContext();
    context.setSorter(new BubbleSort());
    context.sortDouble(list);
    for(int i =0; i< list.length; i++) {
    System.out.println(list[i]);
    }
    }
    }
    SortingClient.java
Note: The quick sort algorithm used here is from "princeton university" site (modified a little to fit the strategy pattern).

18 comments:

  1. hi,
    this program is very useful to me...

    ReplyDelete
  2. Hi,

    Good one really helped me understanding the Strategy Pattern

    Thank You.

    ReplyDelete
  3. Thanks for putting it together. I was really able to get this into my head.

    ReplyDelete
  4. Your descriptions and examples are really good.

    ReplyDelete
  5. Easy to understand. Helped to describe me Strategy pattern!

    ReplyDelete
  6. Could you post more pattern explanations and implementation examples?

    You are great!

    ReplyDelete
  7. hi,

    Should we add defauld constructor
    as : SortingContext(SortInterface sorter) to oblige to set strategies or set a defaut strategy thus to avoid null..sort(list); ?

    ReplyDelete
  8. This is a great example! Could you elaborate a little more on this statement: "You can also have the context set the Concrete strategy implementation itself, based on the request."

    Thanks!

    ReplyDelete
  9. Oh`, thank you very much !
    You are excelent...
    Thank, Again... !
    phanleson@gmail.com
    Security And Development in java

    ReplyDelete
  10. Beauty in Simplicity thats it .Real simple example does the trick again.Great ...

    ReplyDelete
  11. Yeah thats great...now i have a little idean about the strategy pattern thank you so much

    ReplyDelete
  12. Very Informative this program.

    Thanks,
    R. Mahendran

    ReplyDelete
  13. thx a lot, helped me to understand the strategy patter quite fast!

    ReplyDelete
  14. Hi,the array is not sorted!could please tell me why?

    ReplyDelete

Popular Posts