// Examples 7.59 and 7.60 (Figure 7.6) interface Chooser { public Boolean better(T a, T b); } class Arbiter { T bestSoFar; Chooser comp; public Arbiter(Chooser c) { comp = c; } public void consider(T t) { if (bestSoFar == null || comp.better(t, bestSoFar)) bestSoFar = t; } public T best() { return bestSoFar; } } class CaseSensitive implements Chooser { public Boolean better(String a, String b) { return a.compareTo(b) < 1; } } class CaseInsensitive implements Chooser { public Boolean better(Object a, Object b) { return a.toString().compareToIgnoreCase(b.toString()) < 1; } } public class Best { public static void main(String args[]) { Arbiter csNames = new Arbiter(new CaseSensitive()); csNames.consider(new String("Apple")); csNames.consider(new String("aardvark")); System.out.println(csNames.best()); // Apple Arbiter ciNames = new Arbiter(new CaseInsensitive()); ciNames.consider(new String("Apple")); ciNames.consider(new String("aardvark")); System.out.println(ciNames.best()); // aardvark } }