У меня есть абстрактный класс A и несколько его реализаций. Я ожидаю, что это со временем изменится, добавив больше реализаций.Какой шаблон проектирования позволяет абстрагироваться от функциональности на основе типов времени выполнения?
У меня также есть интерфейс, который что-то делает в экземплярах вышеуказанной иерархии классов (например, печатает их).
Я хочу, чтобы реализации интерфейса обеспечивали некоторые специальные функции для некоторых подклассов A и функциональность по умолчанию для остальных.
Я надеюсь, что этот пример проясняет вещи:
abstract class A { }
class B extends A { }
class C extends A { }
interface Processor {
public void process(A a);
}
class SimpleProcessor implements Processor {
//I want this to be called when argument is instance of A or C or any
//new class that will be added in the future
public void process(A a) {
//Line 14
System.out.println("Default processing");
}
//I want this to be called when argument is instance of B
public void process(B b) {
System.out.println("Special processing");
}
}
public class Runner {
public static void main(String[] args) {
B b = new B();
Processor p = new SimpleProcessor();
p.process(b);
}
}
Пример печатает "обработка по умолчанию". Проблема заключается в том, что метод, который будет выполняться, выбирается на основе типа времени компиляции интерфейса. Есть ли способ (или шаблон проектирования), чтобы сделать эту программу печать «Специальная обработка» без добавления в строке 14 списка
if (a instance of B)
process((B) a);
для каждого класса, который нуждается в специальных обработках?
Я взглянул на шаблон visitor, но это не похоже на улучшение, потому что я не хочу «загрязнять» интерфейс процессора с помощью методов для каждого подкласса A, поскольку будет добавлено больше подклассов A.
Иными словами, я хочу, реализации интерфейса для:
- обеспечить собственную реализацию метода для конкретных подклассов
- обеспечивают реализацию по умолчанию для классов, которые будут добавлены в будущее
- избежать перечисления всех классов в большой, если-то-иначе список
Спасибо !!
Образец, который вы ищете, называется «способностью преодолевать» ... –
Стратегия? –
Спасибо всем за ваши ответы. Я, наконец, использовал список тестов if-then-else, например. – idrosid