Это разновидность шаблона шаблонного метода .
AbstractClass {
void method() {
methodImpl();
}
abstract void methodImpl();
}
ConcreteClass extends AbstractClass {
void methodImpl() {
// do stuff
}
}
Этот шаблон также можно использовать, если основная работа выполняется суперклассом, а специализированному классу нужно реализовать только какой-то метод-хук (например, onConnected
).
Обратите внимание, что, похоже, вы также можете попробовать различные шаблоны. Возможно, вместо этого вам следует использовать декоратор , который вызывает обернутую конкретную базу данных (вы также можете иметь несколько уровней различного поведения, что гораздо проще, чем наследование).
Для декоратора:
interface Database { void connect(); }
ConnectionDatabase implements Database {
// pass in SpecializedDatabase
ConnectionDatabase(Database actualDB) {...}
void connect() {
this.setStatus( CONNECTING )
try {
await this.actualDB.connect()
}
this.setStatus( CONNECTED )
}
}
SpecializedDatabase implements Database {
void connect() {
// do stuff
}
}
Вы также можете взглянуть на аспектно-ориентированное программирование , чтобы, например, обернуть некоторые сквозные обработки.
Edit: Еще одно предложение - цепочка ответственности. Она может иметь различные аспекты управления соединением, расположенные друг за другом (больше подходит для последовательного выполнения различных аспектов, а не действительно обертывания вокруг последователя). Это не совсем подходит для того, что есть у вас, но может дать вам повод задуматься о некоторых частях вашей системы.