策略模式

應用策略模式設計並實現一個使用幾種排序算法對整數進行排序的程序。


1:設計排序程序的類圖。

2:要求程序包括客戶端、Context類、策略類。

3、編寫實現的代碼。

 

 設計類圖:

 

 

1.策略(Strategy) : StrategyInterface.java 

public interface StrategyInterface{

  public abstract void algorithm(int [] a);

}

 

2.具體策略(ConcreteStrategy: StrategyAlgorithmOne.java 

 public class StrategyAlgorithmOne   implements  StrategyInterface{

public void algorithm(int [] a){ // 排序算法一

//遍歷輸出排序後的數組

        int temp = 0;

        for (int i = 0; i < a.length; i++) {

          for (int j = 0; j < a.length - 1; j++) {

            if (a[i] > a[j]) {

              // 沒有動作

           } else {

                  temp = a[i];

                  a[i] = a[j];

                  a[j] = temp;

           }

        }

        }

        // 打印冒泡排序過後的數組

        System.out.println("冒泡排序後:");

    for (int j = 0; j < a.length; j++) {

       System.out.print(a[j]+" ");

    }

}

 

2.具體策略(ConcreteStrategy: StrategyAlgorithmTwo.java 

public class StrategyAlgorithmTwo implements StrategyInterface{

public void algorithm(int [] a){ // 排序算法二

 int temp;

       int offset =0;

       for (int i = 0; i < a.length; i++) {

           temp = a[i];

           offset =0;//offset指到每一次排序中最小元素的位置

           for (int j = i+1; j<a.length; j++) {

               if ( temp > a[j]) {

                   temp = a[j];

                   offset = j;

               }

           }

           if(offset>i)

           {

               a[offset] = a[i]; 

               a[i] = temp;

           }

//         遍歷輸出排序後的數組

           System.out.print("" + (i + 1) + "次:");

           for (int k = 0; k < a.length; k++) {

               System.out.print(a[k]+" ");

           }

           System.out.println("");

       }

 

    }

}

 

 

 

2.具體策略(ConcreteStrategy: StrategyAlgorithmThree.java 

import java.util.Arrays;

public class StrategyAlgorithmThree implements StrategyInterface{//排序算法三

public void algorithm(int [] a){

    for(int i=1;i<a.length;i++){

            int insertVal = a[i];

            // insertValue準備和前一個數比較

            int index=i-1;

              

            while(index>=0&&insertVal<a[index])

            {

                //  將把arr[index]向後移動

a[index+1]=a[index];

                // index向前移動一位

                index--;

            }

              

            // insertValue插入到適當位置

            a[index+1]=insertVal;

     }

 

 

//遍歷輸出排序後的數組

    System.out.print("插入排序後:");

    for(int i=0;i<a.length;i++)

    {

        System.out.print(a[i]+" ");

    }

 }

}

 

3.上下文: AlgorithmContext.java 

public class  AlgorithmContext {

     StrategyInterface   strategy;

     public void setStrategy(StrategyInterface strategy){

         this.strategy=strategy;

     } 

     public void SortArray(int [] a){

        if(strategy!=null)

          strategy.algorithm(a); 

        else

          System.out.println("策略爲空,錯誤!");

     }

}

4.應用: Application.java_1

 

public class Application {

 

/**

 * @param args

 */

public static void main(String[] args) {

// TODO 自動生成方法存根

 int a[] = {3,8,1,4,4,10,7,6,5,2};

 int b[] = {3,8,1,4,4,10,7,6,5,2};

 int c[] = {3,8,1,4,4,10,7,6,5,2};

 AlgorithmContext algorithmContext =new AlgorithmContext (); 

// 算法一:冒泡排序

 System.out.println("原數組爲:");

 for (int j = 0; j < a.length; j++) {

        System.out.print(a[j]+" ");

 }

 System.out.println();

 algorithmContext.setStrategy(new StrategyAlgorithmOne ()); 

 algorithmContext. SortArray(a);   

 //算法二:選擇排序

 System.out.println();

 System.out.println("原數組爲:");

 for (int j = 0; j < b.length; j++) {

       System.out.print(b[j]+" ");

 }

 System.out.println();

 System.out.println("進入選擇排序:");

 algorithmContext.setStrategy(new StrategyAlgorithmTwo ());  

 algorithmContext. SortArray(b);  

 //算法三:插入排序

 System.out.println("原數組爲:");

 for (int j = 0; j < c.length; j++) {

       System.out.print(c[j]+" ");

 }

 System.out.println();

 algorithmContext.setStrategy(new StrategyAlgorithmThree ());  

 algorithmContext. SortArray(c);  

 

}

 

}

 

運行結果:

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章