Я пишу объектно-ориентированный код, в котором я пытаюсь использовать шаблон Decorator для реализации различных оптимизаций, которые будут применены к семейству базовых классов во время выполнения. Основное поведение базовых классов - это сложное поведение, полностью реализованное в этих классах, которое действительно вызывает другие внутренние методы для выполнения частей задачи.
Декораторы будут настраивать только внутренние методы, вызываемые сложным поведением в базовом классе.
Вот псевдокод того, чего я пытаюсь достичь:
interface I{
complex();
step1();
step2();
}
class C implements I{
complex(){
...
this.step1();
...
this.step2();
}
step1(){
...
}
step2(){
...
}
}
abstract class Decorator implements I{
I wrapped;
constructor(I obj){
this.wrapped = obj;
}
complex(){
this.wrapped.complex();
}
step1(){
this.wrapped.step1();
}
step2(){
this.wrapped.step2();
}
}
class ConcreteDecorator extends Decorator{
constructor(I obj){
super(obj);
}
step2(){
... // customizing step2()
}
}
Существует множество возможных настроек, которые можно комбинировать, и это главная причина, по которой я использую шаблон декоратора. в противном случае я получу возможность создавать от десятков до сотен подтипов для каждой возможной комбинации настроек.
Теперь, если я попытаюсь создать объект декорированного класса:
x = new C();
y = new ConcreteDecorator(x);
y.complex();
Я ожидаю, что метод complex()
будет выполнен из обернутого основного объекта при использовании переопределенного метода step2()
из декоратора. Но он не работает таким образом, поскольку метод complex () в абстрактном декораторе напрямую вызывает метод на базовом объекте, который действительно пропускает переопределенный step2()
в декораторе.
Моя общая цель - разрешить декораторам переопределять только один или несколько методов stepx()
, которые будут вызываться методом complex()
, который уже реализован в базовом объекте и вызывает все шаги.
Может ли эта функция быть реализована с использованием шаблона проектирования Decorator? Если да, то как, а если нет, то каков соответствующий шаблон проектирования для решения этой проблемы.
Спасибо.