隐藏策略实施细节
面向对象设计中一个非常常见的指导原则是尽可能少但必要时。这也适用于策略模式:通常建议隐藏实现细节,例如哪些类实际实现策略。
对于不依赖于外部参数的简单策略,最常见的方法是使实现类本身为私有(嵌套类)或包私有,并通过公共类的静态字段公开实例:
public class Animal {
private static class AgeComparator implements Comparator<Animal> {
public int compare(Animal a, Animal b) {
return a.age() - b.age();
}
}
// Note that this field has the generic type Comparator<Animal>, *not*
// Animal.AgeComparator!
public static final Comparator<Animal> AGE_COMPARATOR = new AgeComparator();
private final int age;
Animal(int age) {
this.age = age;
}
public int age() {
return age;
}
}
List<Animal> myList = new LinkedList<>();
myList.add(new Animal(10));
myList.add(new Animal(5));
myList.add(new Animal(7));
myList.add(new Animal(9));
Collections.sort(
myList,
Animal.AGE_COMPARATOR
);
公共字段 Animal.AGE_COMPARATOR
定义了一个策略,然后可以在 Collections.sort
等方法中使用,但它不需要用户知道任何有关其实现的信息,甚至不需要知道实现类。
如果你愿意,可以使用匿名类:
public class Animal {
public static final Comparator<Animal> AGE_COMPARATOR = new Comparator<Animal> {
public int compare(Animal a, Animal b) {
return a.age() - b.age();
}
};
// other members...
}
如果策略稍微复杂并且需要参数,则使用静态工厂方法(例如 Collections.reverseOrder(Comparator<T>)
) 是很常见的。该方法的返回类型不应暴露任何实现细节,例如 reverseOrder()
的实现方式
public static <T> Comparator<T> reverseOrder(Comparator<T> cmp) {
// (Irrelevant lines left out.)
return new ReverseComparator2<>(cmp);
}