JAVA设计模式之【策略模式】

简介:
策略模式    定义一些独立的类来封装不同的算法    类似于common方法或者引用类    角色        环境类Context        抽象策略Strategy        具体策略ConcreteStrategy    重构伴随着设计模式        重构类结构        重构文件名称,变量名称        重构算法

看例子,排序算法策略

1.抽象策略

package Strategy;

/**
 * Created by Jiqing on 2016/10/30.
 */
public interface Sort {
    public abstract int[] sort(int arr[]);
}

2.具体排序算法,具体策略

package Strategy;

/**
 * Created by Jiqing on 2016/10/30.
 */
public class BubbleSort implements Sort{ // 冒泡排序策略
    public int[] sort(int arr[]) {
        int len = arr.length;
        for(int i=0;i<len;i++)
        {
            for(int j=i+1;j<len;j++)
            {
                int temp;
                if(arr[i]>arr[j])
                {
                    temp=arr[j];
                    arr[j]=arr[i];
                    arr[i]=temp;
                }
            }
        }
        System.out.println("冒泡排序");
        return arr;
    }
}
package Strategy;

/**
 * Created by Jiqing on 2016/10/30.
 */
public class InsertionSort implements Sort{
    public int[] sort(int arr[])
    {
        int len=arr.length;
        for(int i=1;i<len;i++)
        {
            int j;
            int temp=arr[i];
            for(j=i;j>0;j--)
            {
                if(arr[j-1]>temp)
                {
                    arr[j]=arr[j-1];

                }else
                    break;
            }
            arr[j]=temp;
        }
        System.out.println("插入排序");
        return arr;
    }
}
package Strategy;

/**
 * Created by Jiqing on 2016/10/30.
 */
public class QuickSort implements Sort{
    public int[] sort(int arr[])
    {
        System.out.println("快速排序");
        sort(arr,0,arr.length-1);
        return arr;
    }

    public void sort(int arr[],int p, int r)
    {
        int q=0;
        if(p<r)
        {
            q=partition(arr,p,r);
            sort(arr,p,q-1);
            sort(arr,q+1,r);
        }
    }

    public int partition(int[] a, int p, int r)
    {
        int x=a[r];
        int j=p-1;
        for(int i=p;i<=r-1;i++)
        {
            if(a[i]<=x)
            {
                j++;
                swap(a,j,i);
            }
        }
        swap(a,j+1,r);
        return j+1;
    }

    public void swap(int[] a, int i, int j)
    {
        int t = a[i];
        a[i] = a[j];
        a[j] = t;
    }
}
package Strategy;

/**
 * Created by Jiqing on 2016/10/30.
 */
public class SelectionSort implements Sort
{
    public int[] sort(int arr[])
    {
        int len=arr.length;
        int temp;
        for(int i=0;i<len;i++)
        {
            temp=arr[i];
            int j;
            int samllestLocation=i;
            for(j=i+1;j<len;j++)
            {
                if(arr[j]<temp)
                {
                    temp=arr[j];
                    samllestLocation=j;
                }
            }
            arr[samllestLocation]=arr[i];
            arr[i]=temp;
        }
        System.out.println("选择排序");
        return arr;
    }
}

3.使用环境类

package Strategy;

/**
 * Created by Jiqing on 2016/10/30.
 */
public class ArrayHandler { // 环境类
    private Sort sortObj;
    public int[] sort(int arr[]) { // 基本功能
        sortObj.sort(arr);
        return arr;
    }

    public void setSortObj(Sort sortObj) {  // 设置策略
        this.sortObj = sortObj;
    }
}

4.客户端

package Strategy;

/**
 * Created by Jiqing on 2016/10/30.
 */
public class Client {
    public static void main(String args[])
    {
        int arr[]={1,4,6,2,5,3,7,10,9};
        int result[];
        ArrayHandler ah=new ArrayHandler();

        Sort sort;
        sort=new BubbleSort();

        ah.setSortObj(sort); //设置具体策略
        result=ah.sort(arr);

        for(int i=0;i<result.length;i++)
        {
            System.out.print(result[i] + ",");
        }
    }
}

结果:
冒泡排序
1,2,3,4,5,6,7,9,10

改造客户端

package Strategy;

/**
 * Created by Jiqing on 2016/10/30.
 */
public class Client {
    public static void main(String args[])
    {
        int arr[]={1,4,6,2,5,3,7,10,9};
        int result[],quickresult[];
        ArrayHandler ah=new ArrayHandler();

        Sort bubblesort,quicksort;
        bubblesort=new BubbleSort();
        quicksort= new QuickSort();

        ah.setSortObj(bubblesort); //设置具体策略
        result=ah.sort(arr);

        printArr(result);

        ah.setSortObj(quicksort);
        quickresult=ah.sort(arr);

        printArr(quickresult);

    }

    public static void printArr(int arr[]) { // 必须是静态函数才能被主函数直接调用
        for(int i=0;i<arr.length;i++)
        {
            if (i == arr.length-1) {
                System.out.print(arr[i]);
                System.out.println();

            } else {
                System.out.print(arr[i] + ",");
            }
        }
    }
}

结果:
冒泡排序
1,2,3,4,5,6,7,9,10
快速排序
1,2,3,4,5,6,7,9,10

看类图
422101-20161031000824390-831226862.png


本文转自TBHacker博客园博客,原文链接:http://www.cnblogs.com/jiqing9006/p/6014505.html,如需转载请自行联系原作者

相关文章
|
2月前
|
设计模式 算法 Java
Java设计模式——模板方法模式
Java设计模式——模板方法模式
41 2
|
8月前
|
设计模式 算法 Java
|
8月前
|
设计模式 算法 Java
策略模式【Java设计模式】
策略模式【Java设计模式】
57 0
|
设计模式 算法 前端开发
Java设计模式-策略模式
策略模式属于对象的行为模式。其用意是针对一组算法,将每一个算法封装到具有共同接口的独立的类中,从而使得它们可以相互替换。策略模式使得算法可以在不影响到客户端的情况下发生变化。
|
设计模式 算法 Java
Java设计模式 ->策略模式
Java设计模式 ->策略模式
79 0
|
设计模式 算法 Java
Java设计模式 ->模板方法模式
Java设计模式 ->模板方法模式
74 0
|
设计模式 算法 Java
【设计模式】Java设计模式 - 策略模式
在策略模式(Strategy Pattern)中,一个类的行为或其算法可以在运行时更改。这种类型的设计模式属于行为型模式。我们创建表示各种策略的对象和一个行为随着策略对象改变而改变的 context 对象。策略对象改变 context 对象的执行算法。
125 0
【设计模式】Java设计模式 - 策略模式
|
设计模式 Java 数据库连接
【设计模式】Java设计模式 - 中介者模式
中介者模式(Mediator Pattern)是用来降低多个对象和类之间的通信复杂性。这种模式提供了一个中介类,该类通常处理不同类之间的通信,并支持松耦合,使代码易于维护。中介者模式属于行为型模式。
136 0
【设计模式】Java设计模式 - 中介者模式
|
设计模式 Java 数据库连接
【设计模式】Java设计模式 - 状态模式
在状态模式(State Pattern)中,类的行为是基于它的状态改变的。这种类型的设计模式属于行为型模式。我们创建表示各种状态的对象和一个行为随着状态对象改变而改变的 context 对象。
120 0
【设计模式】Java设计模式 - 状态模式
|
设计模式 算法 Java
Java设计模式-模板方法模式
Java设计模式-模板方法模式
136 0
Java设计模式-模板方法模式