国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Java > 正文

詳解Java編程中的策略模式

2019-11-26 15:01:23
字體:
來源:轉載
供稿:網友

策略模式屬于對象的行為模式。其用意是針對一組算法,將每一個算法封裝到具有共同接口的獨立的類中,從而使得它們可以相互替換。策略模式使得算法可以在不影響到客戶端的情況下發生變化。

策略模式的結構

  策略模式是對算法的包裝,是把使用算法的責任和算法本身分割開來,委派給不同的對象管理。策略模式通常把一個系列的算法包裝到一系列的策略類里面,作為一個抽象策略類的子類。用一句話來說,就是:“準備一組算法,并將每一個算法封裝起來,使得它們可以互換”。下面就以一個示意性的實現講解策略模式實例的結構。

201586113220579.jpg (886×238)

這個模式涉及到三個角色:

  1. 環境(Context)角色:持有一個Strategy的引用。
  2. 抽象策略(Strategy)角色:這是一個抽象角色,通常由一個接口或抽象類實現。此角色給出所有的具體策略類所需的接口。
  3. 具體策略(ConcreteStrategy)角色:包裝了相關的算法或行為。

源代碼
  環境角色類

public class Context {  //持有一個具體策略的對象  private Strategy strategy;  /**   * 構造函數,傳入一個具體策略對象   * @param strategy  具體策略對象   */  public Context(Strategy strategy){    this.strategy = strategy;  }  /**   * 策略方法   */  public void contextInterface(){        strategy.strategyInterface();  }  }

抽象策略類

public interface Strategy {  /**   * 策略方法   */  public void strategyInterface();}

具體策略類

public class ConcreteStrategyA implements Strategy {  @Override  public void strategyInterface() {    //相關的業務  }}public class ConcreteStrategyB implements Strategy {  @Override  public void strategyInterface() {    //相關的業務  }}public class ConcreteStrategyC implements Strategy {  @Override  public void strategyInterface() {    //相關的業務  }}

以策略模式分析Java源碼
聲明:這里參考了Java源碼分析-策略模式在Java集合框架實現代碼中的體現

在java的集合框架中,構造Map或者Set時傳入Comparator比較器,或者創建比較器傳入Collections類的靜態方法中作為方法的參數為Collection排序時,都使用了策略模式

簡單的調用代碼:

  import java.util.*;      public class TestComparator {     public static void main(String args[]) {       LinkedList<String> list = new LinkedList<String>();       list.add("wangzhengyi");       list.add("bululu");              // 創建一個逆序比較器       Comparator<String> r = Collections.reverseOrder();              // 通過逆序比較器進行排序       Collections.sort(list, r);              System.out.println(list);     }   } 

使用Collections.reverseOrder()方法實現一個比較器后,再調用Collections.sort(list, r)把比較器傳入該方法中進行排序,下面看一下sort(list, r)中的代碼:

  public static <T> void sort(List<T> list, Comparator<? super T> c) {     Object[] a = list.toArray();     Arrays.sort(a, (Comparator)c);     ListIterator i = list.listIterator();     for (int j=0; j<a.length; j++) {       i.next();       i.set(a[j]);     }   } 


Array.sort(a, (Comparator)c);這句繼續把比較器傳入處理,下面是Array.sort(a, (Comparator)c)的具體操作:

  public static <T> void sort(T[] a, Comparator<? super T> c) {     if (LegacyMergeSort.userRequested)       legacyMergeSort(a, c);     else       TimSort.sort(a, c);   }   static <T> void sort(T[] a, Comparator<? super T> c) {     sort(a, 0, a.length, c);   }   /** To be removed in a future release. */   private static <T> void legacyMergeSort(T[] a, Comparator<? super T> c) {     T[] aux = a.clone();     if (c==null)       mergeSort(aux, a, 0, a.length, 0);     else       mergeSort(aux, a, 0, a.length, 0, c);   } 


繼續跟下去好了:

 

  private static void mergeSort(Object[] src,                  Object[] dest,                  int low, int high, int off,                  Comparator c) {     int length = high - low;        // Insertion sort on smallest arrays     if (length < INSERTIONSORT_THRESHOLD) {       for (int i=low; i<high; i++)         for (int j=i; j>low && c.compare(dest[j-1], dest[j])>0; j--)           swap(dest, j, j-1);       return;     }        // Recursively sort halves of dest into src     int destLow = low;     int destHigh = high;     low += off;     high += off;     int mid = (low + high) >>> 1;     mergeSort(dest, src, low, mid, -off, c);     mergeSort(dest, src, mid, high, -off, c);        // If list is already sorted, just copy from src to dest. This is an     // optimization that results in faster sorts for nearly ordered lists.     if (c.compare(src[mid-1], src[mid]) <= 0) {       System.arraycopy(src, low, dest, destLow, length);       return;     }        // Merge sorted halves (now in src) into dest     for(int i = destLow, p = low, q = mid; i < destHigh; i++) {       if (q >= high || p < mid && c.compare(src[p], src[q]) <= 0)         dest[i] = src[p++];       else         dest[i] = src[q++];     }   } 


把使用到比較器的代碼挑選出來:

  // If list is already sorted, just copy from src to dest. This is an   // optimization that results in faster sorts for nearly ordered lists.   if (c.compare(src[mid-1], src[mid]) <= 0) {     System.arraycopy(src, low, dest, destLow, length);     return;   } 


這里的compare方法在Comparator接口中也有定義:

  public interface Comparator<T> {     int compare(T o1, T o2);   } 


由于這里是泛型實現了Comparator,所以實際執行時,會根據比較器的具體實現類調用到實現代碼,也就是上面創建的逆序比較器的compare方法,其實現方法如下:

  public int compare(Comparable<Object> c1, Comparable<Object> c2) {      return c2.compareTo(c1);   } 

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 尼木县| 成武县| 宜都市| 安阳县| 保德县| 吉木乃县| 汾阳市| 伊宁县| 孝感市| 祁东县| 托克逊县| 南安市| 涿鹿县| 五指山市| 凯里市| 项城市| 绥芬河市| 江达县| 济宁市| 阿城市| 涿鹿县| 河池市| 农安县| 兴文县| 杭锦旗| 翼城县| 珲春市| 望奎县| 沁水县| 丹阳市| 山东省| 兰考县| 福州市| 孝昌县| 清河县| 三亚市| 楚雄市| 鸡泽县| 白山市| 彩票| 元氏县|