隐藏策略实施细节

面向对象设计中一个非常常见的指导原则是尽可能少但必要时。这也适用于策略模式:通常建议隐藏实现细节,例如哪些类实际实现策略。

对于不依赖于外部参数的简单策略,最常见的方法是使实现类本身为私有(嵌套类)或包私有,并通过公共类的静态字段公开实例:

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);
}