适用环境:如果在一个系统里面有许多类,他们之间的区别仅在于它们的行为,那么使用策略模式可以动态地让一个对象在许多行为中选择一个行为。一个系统需要动态地在几种算法中选择一种,那么可以将这些算法封装到一个个地具体算法类中,而这些具体算法类都是一个抽象算法类的子类。由于多态性原则,客户端可以选择使用任何一个具体算法类,并只需要维持一个数据类型是抽象算法类的对象。不希望客户端知道复杂的、与算法相关的数据结构,在具体策略类中封装算法和相关的数据结构,提高算法的保密性和安全性。 Java SE的容器布局管理就是策略模式应用的一个经典实例。
策略模式队形与解决某一问题的一个算法族,允许用户从该算法族中任选一个算法解决某个问题,同时可以方便地更换算法或者增加新的算法。
定义:定义一系列算法,将每个算法封装起来,并让它们可以相互替换。策略模式让算法独立于使用它地客户端而变化,也称为政策模式。
模式结构图:
代码:
客户端:
package com.strategypattern.hing;
public class Client {
public static void main(String[] args) {
int arr[] = {1,44,5,6,6,2};
Sort s = (Sort)XMLUtil.getBean();
s.sort(arr);
for(int i = 0; i < arr.length; i++) {
System.out.println(arr[i]);
}
}
}
抽象算法类:
package com.strategypattern.hing;
public abstract class Sort {
public int[] sort(int arr[]) {
return null;
}
}
具体算法类:
package com.strategypattern.hing;
public class BubbleSort extends Sort {
public int[] sort(int arr[]) {
int temp = 0;
for(int i = 0; i < arr.length ; i ++) {
for(int j = i; j < arr.length ; j ++) {
if (arr[i] > arr[j]) {
temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
}
}
System.out.println("冒泡排序!");
return arr;
}
}
package com.strategypattern.hing;
public class InsertionSort extends Sort {
public int[] sort(int arr[]) {
int len = arr.length;
for(int i = 1; i < len; i++) {
int temp = arr[i];
int j;//此处定义的变量用于与后面的arr[j] = temp相呼应
for(j = i; j > 0; j --) {
if(arr[j-1] > temp) {
arr[j] = arr[j - 1];
}else {
break;
}
}
arr[j] = temp;
}
System.out.println("插入排序!");
return arr;
}
}
总结:策略模式针对同一问题可以使用不同的解决方案类型的情况下适用性比较好。