关于策略模式,可以简单的认为,将一段算法操作,抽取出来,通过接口的形式进行声明,然后在各自的子类写出各自的实现,这样不会相互影响,并且可以做各种替换,很类似与对象的多态。一种方法,多种算法实现,通过参数的形式做区分。
对于算法,如果全部写在一个方法里面,即使用if-else来区分,难免也很臃肿,阅读性很差。
上代码:
定义一个接口,做声明跟管理
interface IStrategy {
String sort(int[] arr );
}
各自的算法实现:
class StrategyOne implements IStrategy {
@Override
public String sort(int[] arr) {
//冒泡排序
int length = arr.length;
for (int j = 0; j < length; j++) {
//每次循环 都会放置最大值到最右边
for (int i = 1; i < length - j; i++) {
if (arr[i - 1] > arr[i]) {
int tmp = arr[i];
arr[i] = arr[i - 1];
arr[i - 1] = tmp;
}
}
}
return Arrays.toString(arr);
}
}
class StrategyTwo implements IStrategy {
@Override
public String sort(int[] arr) {
//选择排序
int length = arr.length;
for (int i = 0; i < length; i++) {
for (int j = i + 1; j < length; j++) {
if (arr[i] > arr[j]) {
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
}
}
return Arrays.toString(arr);
}
}
这样,将实现方式封装起来,使用的时候通过参数传进去,在不同需求上面做不同的替换。
public class TestStragey {
public static void main(String[] args) {
int[] arr = {33, 242, 421, 53, 2423, 5534,1,3,2,552};
print(arr, new StrategyOne());
print(arr, new StrategyTwo());
}
public static void print(int[] arr, IStrategy strategy) {
String sort = strategy.sort(arr);
System.out.println(sort);
}
}