zoukankan      html  css  js  c++  java
  • 设计模式:策略模式

    设计模式:策略模式

    一、前言

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

      程序代码

  • 相关阅读:
    在TreeView控件节点中显示图片
    PAT 甲级 1146 Topological Order (25 分)
    PAT 甲级 1146 Topological Order (25 分)
    PAT 甲级 1145 Hashing
    PAT 甲级 1145 Hashing
    PAT 甲级 1144 The Missing Number (20 分)
    PAT 甲级 1144 The Missing Number (20 分)
    PAT 甲级 1151 LCA in a Binary Tree (30 分)
    PAT 甲级 1151 LCA in a Binary Tree (30 分)
    PAT 甲级 1149 Dangerous Goods Packaging
  • 原文地址:https://www.cnblogs.com/zyrblog/p/9236370.html
Copyright © 2011-2022 走看看