• 设计模式:策略模式


    设计模式:策略模式

    一、前言

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

      程序代码

  • 相关阅读:
    高考词根树 高考词汇3071
    浏览器的文件访问 API 入门(英文) 资料
    translate speaker 翻译朗读者API vscode 插件推荐 单词发音
    .bat 批处理 手册 教程
    阿里巴巴20220422笔试编程题
    leetcode 587 安装栅栏
    记录一些面试题
    Java编辑提示错误: 编码 GBK 的不可映射字符 (0x80)
    Struct和Class区别?
    Swift String 与 NSString
  • 原文地址:https://www.cnblogs.com/zyrblog/p/9236370.html
Copyright © 2020-2023  润新知