策略模式
- 当使一项功能要使用多种算法(可抽象成同类的算法)进行计算时,可利用多态,通过共同的接口动态地选择不同策略算法。
- 可以避免业务中使用不同策略算法时,写成多个If…else…。
- 适合结合责任链模式使用。
构建过程
- 抽象接口。
将不同的处理策略算法,抽象出共性(输入、输出等),定义到相同的接口方法中。 - 实现多种策略类。
基于共同的接口,根据需求定义并实现多种策略类。 - 使用策略。
当要使用某策略时(例如策略X),定义接口引用,指向策略X类实例化对象。
进行计算的业务方法中只需通过接口传递对应的策略X类,和策略X类要计算的数据即可。
场景及使用
- 业务功能可根据不同的实现类动态地选择不同的算法。
简单例子:业务功能是判断对象大小,那么猫和狗两个不同类,需要使用不同的判断策略。假设狗比较大小是按尾巴长度。猫比较大小的算法是按年龄。😁😁😁那么可以基于Comparator接口实现两种策略算法,完成业务计算。
猫类
public class Cat {
public String name;
public int age;
Cat(String name,int age)
{
this.age = age;
this.name = name;
}
@Override
public String toString() {
return "Cat{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
狗类
public class Dog {
public String name;
public int tail;
Dog(String name,int tail)
{
this.tail = tail;
this.name = name;
}
@Override
public String toString() {
return "Dog{" +
"name='" + name + '\'' +
", tail=" + tail +
'}';
}
}
猫狗不同的策略类
public class CatStrategy implements Comparator<Cat> {
@Override
public int compare(Cat o1, Cat o2) {
if(o1.age > o2.age) return 1;
else if (o1.age < o2.age) return -1;
else return 0;
}
}
public class DogStrategy implements Comparator<Dog> {
@Override
public int compare(Dog o1, Dog o2) {
if(o1.tail > o2.tail) return 1;
else if (o1.tail < o2.tail) return -1;
else return 0;
}
}
主方法
public class Strategy_v1 {
//定义比较猫的策略
static Comparator cat_strategy = new CatStrategy();
//定义比较狗的策略
static Comparator dog_strategy = new DogStrategy();
public static void main(String[] args) {
Cat c1 = new Cat("Mimi",20);
Cat c2 = new Cat("OldDriver",40);
//调用通用业务方法
BusinessMethod(cat_strategy,c1,c2);
Dog d1 = new Dog("WangWang",1);
Dog d2 = new Dog("LongTailer",3);
//调用通用业务方法
BusinessMethod(dog_strategy,d1,d2);
}
//业务方法中只需要传递 策略类,计算对象
public static void BusinessMethod(Comparator strategy, Object o1,Object o2)
{
if(strategy.compare(o1,o2) > 0) System.out.println("Bigger is " + o1.toString());
else if(strategy.compare(o1,o2) < 0) System.out.println("Bigger is " + o2.toString());
else System.out.println("Equal !");
}
}
顺便比较下comparator和comparable接口
- Comparable
- 位于lang包下,就一个接口方法CompareTo;
- 用于和另一个同类对象比较,实现自然排序;
- 接口需要侵入到“比较对象类”的内部实现,耦合性强!
- Comparator
- 位于Util包下,接口方法Compare(T o1, T o2),Java 1.8后增加了很多default方法。
- 可实现类中两个对象的比较。当对Comparable自然排序不满意时,可实现自己的比较算法,实现排序逻辑。
- 不需要侵入到“比较对象类”内部实现,可在任意类中实现Compare方法,相比Comparable耦合性低,可用于策略模式。