應用策略模式設計並實現一個使用幾種排序算法對整數進行排序的程序。
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);
}
}
運行結果: