设计模式——策略模式_第1张图片

 《Effective Java》

第21条:用函数对象表示策略

java.util.Comparator
比较器接口是一个策略,根据比较规则(排序规则)可以有各种不同的具体实现(具体策略),如按字符串长度排序,忽略字符串大小写排序。
 
String类的比较器具体策略 CaseInsensitiveComparator
   
   
   
   
  1. /** 
  2.      * A Comparator that orders String objects as by 
  3.      * compareToIgnoreCase. This comparator is serializable. 
  4.      * 

     

  5.      * Note that this Comparator does not take locale into account, 
  6.      * and will result in an unsatisfactory ordering for certain locales. 
  7.      * The java.text package provides Collators to allow 
  8.      * locale-sensitive ordering. 
  9.      * 
  10.      * @see     java.text.Collator#compare(String, String) 
  11.      * @since   1.2 
  12.      */ 
  13.     public static final Comparator CASE_INSENSITIVE_ORDER 
  14.                                          = new CaseInsensitiveComparator(); 
  15.     private static class CaseInsensitiveComparator 
  16.                          implements Comparator, java.io.Serializable { 
  17.     // use serialVersionUID from JDK 1.2.2 for interoperability 
  18.     private static final long serialVersionUID = 8575799808933029326L; 
  19.  
  20.         public int compare(String s1, String s2) { 
  21.             int n1=s1.length(), n2=s2.length(); 
  22.             for (int i1=0, i2=0; i1
  23.                 char c1 = s1.charAt(i1); 
  24.                 char c2 = s2.charAt(i2); 
  25.                 if (c1 != c2) { 
  26.                     c1 = Character.toUpperCase(c1); 
  27.                     c2 = Character.toUpperCase(c2); 
  28.                     if (c1 != c2) { 
  29.                         c1 = Character.toLowerCase(c1); 
  30.                         c2 = Character.toLowerCase(c2); 
  31.                         if (c1 != c2) { 
  32.                             return c1 - c2; 
  33.                         } 
  34.                     } 
  35.                 } 
  36.             } 
  37.             return n1 - n2; 
  38.         } 
  39.     } 
如果该比较器被多次调用,最好使用以上方式进行初始化,否则可能会引起多次创建对象造成不必要的资源损耗。
  为了在Java中实现策略模式,要声明一个接口来表示该策略,并且为每个具体策略声明一个实现了该接口的类。当一个具体策略只被使用一次时,通常使用匿名类来声明和实例化这个具体策略类。当一个具体策略是设计用来重复使用的时候,它的类通常就要被实现为私有的静态成员类,并通过公有的静态final域被导出,其类型为该策略接口。