策略模式
- 顾名思义,在一个类中给出通用接口方法,让其他类能够调用
- 避免过多的
if...else
- 策略模式让一个类的行为或其算法可以在运行时更改
- 如果在一个系统里面有许多类,它们之间的区别仅在于它们的行为,那么使用策略模式可以动态地让一个对象在许多行为中选择一种行为
策略模式举例
利用comparaTo
函数拓展排序算法能够接受的类
- 和重载有点相似
comparable
接口就是一个策略模式,它里面只有一个接口函数comparaTo
- 简单例子,利用
comparaTo
, 实现Sorter
类,给自定义类Cat
排序
Cat.java
package java_class01;
public class Cat {
private int size;
private String name;
public Cat(int size, String name) {
super();
this.size = size;
this.name = name;
}
public int getSize() {
return size;
}
public String getName() {
return name;
}
public int compareTo(Cat c) {
if(this.size < c.size) return -1;
else if(this.size > c.size) return 1;
else if(this.name.compareTo(c.name)==1) return 1;
else if(this.name.compareTo(c.name)==-1) return -1;
else return 0;
}
@Override
public String toString() {
return "Cat [size=" + size + ", name=" + name + "]";
}
}
Sorter.java
package java_class01;
public class Sorter {
public static void sort(Cat[] arr) {
for(int i = 0;i < arr.length-1;i++) {
int minPos = i;
for(int j = i+1;j < arr.length;j++) {
minPos = (arr[minPos].compareTo(arr[j]))==-1 ? minPos:j;
}
swap(arr, minPos, i);
}
}
public static void swap(Cat[] arr, int i, int j) {
Cat tmp = arr[i];
arr[i] = arr[j];
arr[j] = tmp;
}
}
Main.java
package java_class01;
import java.util.Arrays;
public class Main {
public static void main(String[] args) {
final int NUM = 10;
Cat []c = new Cat[NUM];
for(int i = 0;i < NUM;i++) {
int x = (int) (Math.random()*100);
String name = "Tom_"+i;
c[i] = new Cat(x, name);
}
System.out.println(Arrays.toString(c));
Sorter.sort(c);
System.out.println(Arrays.toString(c));
}
}
总结
- 策略模式主要在于提供通用方法接口
- 当各个类中的方法的算法比较统一,区别只在于一些成员变量的时候,尽可能将算法封装为统一的接口,不同类中调用的时候再实现
参考