【发布时间】:2019-10-28 18:30:48
【问题描述】:
我正在编写一个面向对象的代码,我在其中尝试使用装饰器模式来实现各种优化,以便在运行时应用于一系列核心类。核心类的主要行为是在这些类中完全实现的复杂行为,它确实调用了其他内部方法来完成任务。 装饰器只会自定义核心类中复杂行为调用的内部方法。
这是我想要达到的伪代码:
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() 方法调用。
这个功能完全可以使用装饰器设计模式来实现吗?如果是,如何,如果不是,解决此问题的适当设计模式是什么。
谢谢。
【问题讨论】:
-
步骤方法真的需要成为接口的一部分,即公开吗?
-
@Derefacto 是的!
complex()是类的主要行为。但是为了能够自定义行为的不同部分,我创建了那些较小的step()方法,其中任何一个都可以被子类/装饰器覆盖。
标签: oop design-patterns decorator