Книга: Экстремальное программирование. Разработка через тестирование

Встраиваемый переключатель (Pluggable Selector)[26]

Встраиваемый переключатель (Pluggable Selector)[26]

Как обеспечить различающееся поведение разных экземпляров одного и того же класса? Сохраните имя метода в переменной и динамически обращайтесь к этому методу.

Что делать, если у вас есть десять подклассов одного базового класса и в каждом из них реализован только один метод? Может оказаться, что создание подклассов – это слишком тяжеловесный механизм для реализации столь небольших различий в поведении объектов.

abstract class Report {

abstract void print();

}

class HTMLReport extends Report {

void print() {…

}

}

class XMLReport extends Report {

void print() {…

}

}

Альтернативное решение: создать единственный класс с оператором switch. В зависимости от значения поля происходит обращение к разным методам. Однако в этом случае имя метода упоминается в трех местах:

• при создании экземпляра;

• в операторе switch;

• в самом методе.

abstract class Report {

String printMessage;

Report(String printMessage) {

this.printMessage = printMessage;

}

void print() {

switch (printMessage) {

case "printHTML":

printHTML();

break;

case "printXML":

printXML():

break;

}

};

void printHTML() {

}

void printXML() {

}

}

Каждый раз, когда вы добавляете новую разновидность печати, вы должны позаботиться о добавлении нового метода печати и редактировании оператора switch.

Шаблон «Встраиваемый переключатель» (Pluggable Selector) предлагает динамически обращаться к методу с использованием механизма рефлексии:

void print() {

Method runMethod = getClass(). getMethod(printMessage, null);

runMethod.invoke(this, new Class[0]);

}

По-прежнему существует весьма неприятная зависимость между создателями отчетов и именами методов печати, однако, по крайней мере, мы избавились от оператора switch.

Естественно, этим шаблоном не следует злоупотреблять. Самая большая связанная с ним проблема состоит в отслеживании вызываемого кода. Используйте встраиваемый переключатель только в случае, когда вы оказались в стандартной ситуации: каждый из подклассов обладает всего одним методом, и у вас есть желание сделать этот код более чистым.

Оглавление книги


Генерация: 0.308. Запросов К БД/Cache: 3 / 1
поделиться
Вверх Вниз