Классический шаблонный метод реализуется через один абстрактный класс с зашитым алгоритмом и множество дочерних классов с переопределенными методами-шагами алгоритма. Есть другой вариант реализации этого шаблона, он подойдет для случаев, когда нет необходимости построения иерархии классов или это попросту нецелесообразно. Для этого объявляется внутренний скрытый интерфейс, скрытый метод базового алгоритма и множество методов для модификации базового алгоритма. Расширяющие методы вызывают базовый метод и передают в него объект безымянного класса, реализующего скрытый интерфейс с соответствующим кодом переопределенного шага алгоритма. Далее пример с двумя методами получения мин/макс значений:
public class TestO {
private interface MinMaxComparator {
boolean compare(int i1, int i2);
}
private int get(List list, MinMaxComparator comparator) {
int retval = 0;
for (Integer value : list) {
if (comparator.compare(retval, value)) {
retval = value;
}
}
return retval;
}
public int min(List list) {
return get(list, new MinMaxComparator() {
@Override
public boolean compare(int i1, int i2) {
return i1 & gt; i2;
}
});
}
public int max(List list) {
return get(list, new MinMaxComparator() {
@Override
public boolean compare(int i1, int i2) {
return i1 & lt; i2;
}
});
}
}
Не следует путать шаблоны "Шаблонный метод" и "Callback" - они принципиально отличаются (как это сделали в русской википедии в разделе "Зачем использовать функции обратного вызова"). В шаблонном методе, в данном случае, передается объект, несущий некую функциональность важную для выполнения алгоритма, в коллбеке же передается объект по которому можно отправить результат или просто сообщить о завершении выполнения метода, т.е. callback-объект никак не влияет на результат.
|