程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> 詳解Java編程中的戰略形式

詳解Java編程中的戰略形式

編輯:關於JAVA

詳解Java編程中的戰略形式。本站提示廣大學習愛好者:(詳解Java編程中的戰略形式)文章只能為提供參考,不一定能成為您想要的結果。以下是詳解Java編程中的戰略形式正文


戰略形式屬於對象的行動形式。其意圖是針對一組算法,將每個算法封裝到具有配合接口的自力的類中,從而使得它們可以互相調換。戰略形式使得算法可以在不影響到客戶真個情形下產生變更。

戰略形式的構造

  戰略形式是對算法的包裝,是把應用算法的義務和算法自己朋分開來,委派給分歧的對象治理。戰略形式平日把一個系列的算法包裝到一系列的戰略類外面,作為一個籠統戰略類的子類。用一句話來講,就是:“預備一組算法,並將每個算法封裝起來,使得它們可以交換”。上面就以一個表示性的完成講授戰略形式實例的構造。

這個形式觸及到三個腳色:

  1. 情況(Context)腳色:持有一個Strategy的援用。
  2. 籠統戰略(Strategy)腳色:這是一個籠統腳色,平日由一個接口或籠統類完成。此腳色給出一切的詳細戰略類所需的接口。
  3. 詳細戰略(ConcreteStrategy)腳色:包裝了相干的算法或行動。
  4. 源代碼
      情況腳色類

    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); 
      } 
    
    

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved