设计模式:策略模式

设计模式:策略模式

一、前言

  下面我们看一下策略模式,策略模式其实比较简单,相信大家都使用过,只不过不清楚而已,其实就是使用抽象类或者接口,定义一个方法,然后子类来实现相应的方法,之后通过一个新的类来使用这个已经定义好的组件,使用委托(组合)的方式,让定义的接口根据多态来灵活的使用相应的实现方法,最终完成一定的功能。和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("\n=========================");
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),直接使用某种方法是一种大忌,因为以后要使用别的还需要修改,这破坏了代码的封装性,因此,我们不推荐这样做,因此就有了这个策略模式,可以很方便的进行策略的扩充,而不需要修改原有的代码。

  程序代码

posted @ 2018-06-27 22:40  精心出精品  阅读(646)  评论(0编辑  收藏  举报