讨论/《Java 实战(第 2 版)》 - 2.2 行为参数化/
《Java 实战(第 2 版)》 - 2.2 行为参数化
共 1 个回复

答案:首先,你需要一种表示接受Apple并返回一个格式String值的方法。前面我们在编写ApplePredicate接口的时候,写过类似的东西:

public interface AppleFormatter{
String accept(Apple a);
}

现在你就可以通过实现AppleFormatter方法来表示多种格式行为了:

public class AppleFancyFormatter implements AppleFormatter{
public String accept(Apple apple){
    String characteristic = apple.getWeight() > 150 ? "heavy" :
        "light";
    return "A " + characteristic +
           " " + apple.getColor() +" apple";
}
}
public class AppleSimpleFormatter implements AppleFormatter{
public String accept(Apple apple){
    return "An apple of " + apple.getWeight() + "g";
}
}

最后,你需要告诉prettyPrintApple方法接受AppleFormatter对象,并在内部使用它们。你可以给prettyPrintApple加上一个参数:

public static void prettyPrintApple(List<Apple> inventory,
                                AppleFormatter formatter){
for(Apple apple: inventory){
    String output = formatter.accept(apple);
    System.out.println(output);
}
}

搞定啦!现在你就可以给prettyPrintApple方法传递多种行为了。为此,你首先要实例化AppleFormatter的实现,然后把它们作为参数传给prettyPrintApple

prettyPrintApple(inventory, new AppleFancyFormatter());

这将产生一个类似于下面的输出:

A light green apple
A heavy red apple
...

或者试试这个:

prettyPrintApple(inventory, new AppleSimpleFormatter());

这将产生一个类似于下面的输出:

An apple of 80g
An apple of 155g
...
2