可以说,我们有一个给定的具有树数据结构的外部库。示例:具有子类的超S
类。子类也可能有子类。B1
B5
现在我想为这个数据结构添加一个额外的方法。通常,人们会使用多态来实现它:每个子类都实现特定的方法。
但是因为我们处理的是一个外部库,所以我们不能改变原来的类。我想到了两种替代解决方案:
- 使用一个方法创建一个新类,该方法通过使用检查大小写
instanceof
- 为每个类创建子类并在那里实现方法。
哪种方法是常见的情况?或者,是否有更好的替代解决方案?
可以说,我们有一个给定的具有树数据结构的外部库。示例:具有子类的超S
类。子类也可能有子类。B1
B5
现在我想为这个数据结构添加一个额外的方法。通常,人们会使用多态来实现它:每个子类都实现特定的方法。
但是因为我们处理的是一个外部库,所以我们不能改变原来的类。我想到了两种替代解决方案:
instanceof
哪种方法是常见的情况?或者,是否有更好的替代解决方案?
装饰器设计模式可能会有所帮助。您可以拥有一个从 Class 扩展的装饰器类S
。它也包裹了一个S
。您可以在装饰器中实现您的方法。
装饰器模式可能会派上用场
class S2 extends S {
S s;
S2(S s) {
this.s = s;
}
// delegate method calls to wrapped B1-B5 instance
@Override
void oldMethod1() {
s.oldMethod1();
}
...
// add new methods
void newMetod1() {
...
}
}
然后将其用作
new S2(new B1());
或在 B1 的现有实例上
new S2(b1);
访问者设计模式使您能够向现有数据结构“添加”新操作。