应用策略模式设计并实现一个使用几种排序算法对整数进行排序的程序。
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);
}
}
运行结果: