zoukankan      html  css  js  c++  java
  • 设计模式--策略模式--简记

    策略模式(Strategy Pattern):

      一个类的行为或算法可以在运行是更改。

      比如:要实现一个通用的比较大小的类方法,单个对象比较大小的策略可能会发生改变,可能会出现多种比较策略,我们可定义一个比较策略接口,对象类中比较的大小的方法,可以通过更改策略实现对象,来进行替换。

    优点:

      算法可以自由切换、避免多重条件判断、扩展性好

    缺点:

      策略类会增多,策略类需要对外暴露

    例:定义一个猫类

     1 package cn.qf.lean.dp;
     2 
     3 import java.util.Comparator;
     4 
     5 /*
     6  * 定义一只猫类,类中含比较猫的大小的方法
     7  * 猫大小的比较含多个维度的比较策略
     8  */
     9 
    10 public class Cat implements Comparable<Cat> {
    11     
    12     private int height;
    13     private int weight;
    14     //通过高度的比较策略比较猫的大小
    15     private Comparator<Cat> comparator = new CatHeightComparator();
    16     //通过宽度的比较策略比较猫的大小
    17 //    private Comparator<Cat> comparatorW = new CatWeightComparator();
    18         
    19     public Cat(int i, int j) {
    20         this.height = i;
    21         this.weight = j;
    22     }
    23     public int getHeight() {
    24         return height;
    25     }
    26     public void setHeight(int height) {
    27         this.height = height;
    28     }
    29     public int getWeight() {
    30         return weight;
    31     }
    32     public void setWeight(int weight) {
    33         this.weight = weight;
    34     }
    35     
    36     public Comparator<Cat> getComparator() {
    37         return comparator;
    38     }
    39     public void setComparator(Comparator<Cat> comparator) {
    40         this.comparator = comparator;
    41     }
    42     
    43     @Override
    44     public int compareTo(Cat o) {
    45         return comparator.compare(this, o);
    46     }
    47     
    48     @Override
    49     public String toString() {
    50         return height + "|" + weight;
    51     }
    52 
    53 }
    View Code

    猫大小比较的两种策略

     1 package cn.qf.lean.dp;
     2 
     3 import java.util.Comparator;
     4 
     5 /*
     6  * 通过比较猫的高度的策略,比较猫的大小
     7  */
     8 
     9 public class CatHeightComparator implements Comparator<Cat> {
    10 
    11     
    12 
    13     @Override
    14     public int compare(Cat o1, Cat o2) {
    15         if(o1.getHeight() > o2.getHeight()) return 1;
    16         else if(o1.getHeight() < o2.getHeight()) return -1;
    17         else return 0;
    18     }
    19 
    20 }
    View Code
     1 package cn.qf.lean.dp;
     2 
     3 import java.util.Comparator;
     4 
     5 /*
     6  * 通过比较猫的宽度的策略,比较猫的大小
     7  */
     8 
     9 public class CatWeightComparator implements Comparator<Cat> {
    10 
    11 
    12     @Override
    13     public int compare(Cat o1, Cat o2) {
    14         if(o1.getWeight() > o2.getWeight()) return 1;
    15         else if(o1.getWeight() < o2.getWeight()) return -1;
    16         else return 0;
    17     }
    18 
    19 }
    View Code

    比较类

     1 package cn.qf.lean.dp;
     2 
     3 /*
     4  * 比较算法
     5  */
     6 
     7 public class DataSorter {
     8     
     9     public static void sort(Comparable[] a) {
    10         
    11         for(int i=a.length; i>0; i--) {
    12             for(int j=0; j<i-1; j++) {
    13                 Comparable c1 = (Comparable)a[j];
    14                 Comparable c2 = (Comparable)a[j+1];
    15                 if(c1.compareTo(c2) == 1) {
    16                     swap(a, j, j+1);
    17                 }
    18             }
    19         }
    20     }
    21     
    22     
    23     private static void swap(Object[] a, int x, int y) {
    24         // TODO Auto-generated method stub
    25         Object temp = a[x];
    26         a[x] = a[y];
    27         a[y] = temp;
    28     }
    29 
    30 
    31 
    32     public static void p(Object[] a) {
    33         
    34         for(int i=0; i<a.length; i++) {
    35             System.out.print(a[i] + " ");
    36         }
    37         System.out.print("
    ");
    38     }
    39 
    40 }
    View Code

    测试

    package cn.qf.lean.dp;
    
    public class Test {
        
        public static void main(String[] args) {
            
            Cat[] a = {new Cat(5, 5), new Cat(3, 3), new Cat(1,1)};
            DataSorter.sort(a);
            DataSorter.p(a);
            
        }
    }
  • 相关阅读:
    CSS3实现3D木块旋转动画
    灰色大气企业html5模板
    同程联盟景点门票动态程序 beta1.0源码
    java 创建 HMAC 签名
    左侧浮动html网页模板
    农业公司flash动画模板
    纯CSS3左右滑动开关按钮
    jQuery移动光标改变图像
    四叶草与动感线条背景矢量图
    看过的bootstrap书籍(附下载地址)
  • 原文地址:https://www.cnblogs.com/fqfanqi/p/8594222.html
Copyright © 2011-2022 走看看