设计模式:策略模式
一、前言
下面我们看一下策略模式,策略模式其实比较简单,相信大家都使用过,只不过不清楚而已,其实就是使用抽象类或者接口,定义一个方法,然后子类来实现相应的方法,之后通过一个新的类来使用这个已经定义好的组件,使用委托(组合)的方式,让定义的接口根据多态来灵活的使用相应的实现方法,最终完成一定的功能。和Builder模式比起来,Builder中新建的类还要对接口中的元素方法进行组合和操作,而策略模式只用一个方法就可以,没有这种复杂的操作,就是简单的使用已经定义好的方法,不用再次封装操作。和桥接模式相比,差别也是很明显的,桥接是功能层次和实现层次分离,而策略模式是方便扩充策略,但是这几种模式的某些部分是很类似的,只不过完成的任务有些许不同而已。
二、代码
Sorter 代码:
1 package zyr.dp.strategy; 2 3 public interface Sorter { 4 public abstract void sort(Comparable [] data); 5 }
BubbleSorter 代码:
1 package zyr.dp.strategy; 2 3 public class BubbleSorter implements Sorter{ 4 5 public void sort(Comparable[] data) { 6 for(int i=0;i<data.length;i++){ 7 for(int j=i+1;j<data.length;j++){ 8 if(data[i].compareTo(data[j])>0) 9 { 10 Comparable temp=data[i]; 11 data[i]=data[j]; 12 data[j]=temp; 13 } 14 } 15 } 16 17 } 18 19 }
QuickSorter 代码:
1 package zyr.dp.strategy; 2 3 public class QuickSorter implements Sorter{ 4 5 public void sort(Comparable[] data) { 6 int low=0,high=data.length-1; 7 Qsort(data, low, high) ; 8 } 9 /**************快速排序*****************/ 10 private int Partiton(Comparable[] data,int low,int high) 11 { 12 Comparable temp,pivotkey; 13 pivotkey=data[low]; //选取支点 14 temp=pivotkey; //暂存支点 15 while (low<high) //条件,相等则结束 16 { 17 while (low<high && data[high].compareTo(pivotkey)>=0) 18 { 19 high--;//左移 20 } 21 data[low]=data[high];//覆盖 22 while (low<high && data[low].compareTo(pivotkey)<=0) 23 { 24 low++; //右移 25 } 26 data[high]=data[low];//覆盖 27 } 28 data[low]=temp; //恢复 29 return low; //返回分界点位置 30 } 31 private void Qsort(Comparable[] data,int low,int high) 32 { 33 int pivot; 34 if (low<high) 35 { 36 pivot=Partiton(data,low,high); //获得分界点位置 37 Qsort(data,low,pivot-1); //排左边 38 Qsort(data,pivot+1,high);//右边 39 } 40 } 41 42 }
SortAndPrint代码:
1 package zyr.dp.strategy; 2 3 public class SortAndPrint { 4 private Comparable [] data; 5 private Sorter sorter; 6 public SortAndPrint(Comparable [] data,Sorter sorter){ 7 this.data=data; 8 this.sorter=sorter; 9 } 10 public void execuate(){ 11 printResult(); 12 sorter.sort(data); 13 printResult(); 14 } 15 public void printResult(){ 16 System.out.println("========================="); 17 for(int i=0;i<data.length;i++){ 18 System.out.print(data[i]+" "); 19 } 20 System.out.println(" ========================="); 21 } 22 23 24 25 }
Main类:
1 package zyr.dp.strategy; 2 3 public class Main { 4 5 public static void main(String[] args) { 6 7 Comparable []data1={"zyr","lsx","love","forever"}; 8 SortAndPrint sap1=new SortAndPrint(data1,new QuickSorter()); 9 System.out.println("=====策略一======"); 10 sap1.execuate(); 11 System.out.println("=====策略二======"); 12 Comparable []data2={"zyr","lsx","love","forever"}; 13 SortAndPrint sap2=new SortAndPrint(data2,new BubbleSorter()); 14 sap2.execuate(); 15 16 } 17 18 }
运行结果:
三、总结
从代码中我们可以看到没有什么新的元素加入,当我们使用一种方法的时候,这种方法有很多实现方式,比如说加密算法,可以有MD5、SHA1、RSA等等,对于这些算法,我们如果一个个实现就会变得非常的差劲,特别是对于调用方(SortAndPrint),直接使用某种方法是一种大忌,因为以后要使用别的还需要修改,这破坏了代码的封装性,因此,我们不推荐这样做,因此就有了这个策略模式,可以很方便的进行策略的扩充,而不需要修改原有的代码。