亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > 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);   } 

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产伊人精品在线| 成人xxxxx| 97色在线观看| 在线观看中文字幕亚洲| 欧美激情一区二区久久久| 综合网日日天干夜夜久久| 国产精品精品一区二区三区午夜版| 亚洲a在线播放| 精品国产一区av| 日韩视频免费中文字幕| 成人激情视频在线| 日韩最新免费不卡| 日韩av在线资源| 欧美小视频在线观看| 色噜噜狠狠狠综合曰曰曰88av| 亚洲视频欧洲视频| 91精品国产综合久久香蕉的用户体验| 91精品视频播放| 日本aⅴ大伊香蕉精品视频| 国产精品高清网站| 91wwwcom在线观看| 亚洲精品之草原avav久久| 国产一区香蕉久久| 草民午夜欧美限制a级福利片| 欧美激情在线一区| 久久久久99精品久久久久| 高清在线视频日韩欧美| 久久久精品在线观看| 伊人久久大香线蕉av一区二区| 91经典在线视频| 一区二区三区视频免费在线观看| 国产久一一精品| 久久久精品美女| 亚洲天堂日韩电影| 韩国国内大量揄拍精品视频| 亚洲欧美变态国产另类| 视频一区视频二区国产精品| 亚洲欧洲国产一区| 韩国美女主播一区| 久久视频精品在线| 欧美大尺度在线观看| 亚洲精品福利在线| 亚洲精品视频免费在线观看| 欧美成人午夜激情视频| 国产在线一区二区三区| 欧美日本啪啪无遮挡网站| 青青草精品毛片| 久久av红桃一区二区小说| 亚洲一区美女视频在线观看免费| 黄色成人在线播放| 亚洲福利精品在线| 亚洲精品美女视频| 成人h片在线播放免费网站| 97久久久免费福利网址| 日本精品久久久| 成人性生交xxxxx网站| 一本色道久久88综合亚洲精品ⅰ| 色偷偷9999www| 另类视频在线观看| 欧美激情乱人伦一区| 亚洲欧美日韩国产精品| 精品久久久视频| 国产精品免费一区二区三区都可以| 中文字幕少妇一区二区三区| 国产精品黄色av| 国产啪精品视频网站| 日韩精品一区二区三区第95| 最近2019中文字幕大全第二页| 亚洲精品成人网| 久久人人爽人人爽爽久久| 亚洲va男人天堂| 欧美高清视频在线播放| 亚洲精品女av网站| 亚洲成人精品久久| 中文字幕亚洲欧美日韩高清| 日韩中文视频免费在线观看| 国产99在线|中文| 国产精品久久在线观看| 国内精品视频久久| 欧美日韩国产成人在线观看| 国产欧美中文字幕| 国产一区二区三区精品久久久| 亚洲天堂精品在线| 亚洲精品免费一区二区三区| 色偷偷av一区二区三区乱| www.美女亚洲精品| 欧美成年人视频网站欧美| 色妞在线综合亚洲欧美| 日韩欧美精品网址| 精品视频一区在线视频| 国产亚洲福利一区| 成人av.网址在线网站| 国产欧美精品一区二区三区介绍| 亚洲视频在线观看网站| 国产日产欧美精品| 久久视频这里只有精品| 亚洲久久久久久久久久久| 中文字幕日韩欧美精品在线观看| 国产精品视频yy9099| 57pao国产成人免费| 欧美大片va欧美在线播放| 欧美精品福利视频| 欧美视频专区一二在线观看| 欧美精品videos| 亚洲qvod图片区电影| 在线观看欧美www| 日本伊人精品一区二区三区介绍| 欧美日韩一区二区三区| 91av视频导航| 亚洲精品www久久久| 国产精品com| 91精品国产综合久久香蕉922| 欧美国产日韩一区| 亚洲色无码播放| 国模叶桐国产精品一区| 九九久久久久99精品| 欧美国产亚洲精品久久久8v| 不卡伊人av在线播放| 欧美午夜视频一区二区| 国产不卡一区二区在线播放| 亚洲第一二三四五区| 国产成人精品一区二区| 26uuu另类亚洲欧美日本一| 亚洲bt天天射| 成人免费在线视频网站| 日韩精品在线看| 色狠狠av一区二区三区香蕉蜜桃| 日韩av影院在线观看| 亚洲第一区在线| 久久久精品国产一区二区| 国产日韩在线观看av| 国产精品v日韩精品| 日本不卡视频在线播放| 红桃视频成人在线观看| 91成人性视频| 亚洲性线免费观看视频成熟| 日韩动漫免费观看电视剧高清| 亚洲成人av片在线观看| 欧美丰满少妇xxxxx做受| 亚洲国产精品免费| 亚洲国产精品va在线看黑人| 欧美性猛交xxxx乱大交极品| 亚洲精品在线看| 亚洲精品中文字幕女同| 欧美国产日韩一区二区在线观看| 久久国产精品偷| 91亚洲国产成人久久精品网站| 国内精品久久久久影院优| 久久成人18免费网站| 草民午夜欧美限制a级福利片| 国产精品影院在线观看| 欧美丝袜美女中出在线| 欧美与欧洲交xxxx免费观看| 日本a级片电影一区二区| 国产成人小视频在线观看| 国产美女91呻吟求| 国产成人免费av电影| 亚洲xxx大片| 91成人在线观看国产| 91精品视频免费观看| 亚洲国产美女精品久久久久∴| 国产欧美亚洲精品| 国产精品日韩精品| 亚洲直播在线一区|