一个接口定义了一系列函数func1到func20。有许多派生类只实现了这 20 个函数的一部分。func的实现有自己的模式,例如:f1的实现有2种,f2的实现有3种。派生类将实现接口中定义的大约 3 到 5 个数字 func,并且所有这些实现都是在定义的种类中选择的。派生类中的大多数 func 为空意味着当外部模型通过引用接口调用它时什么都不做。是否有一种模式可以对对象进行固定实现并使用它们来配置派生类?例如:派生类 D1 需要实现 f2 & f10,f2 使用从所有 3 种中选择的第一种实现。f10 使用从所有 2 种中选择的第二种实现。
我现在的解决方案很简单:只从接口派生并覆盖它需要的函数,但问题是:func实现的增加比派生类慢得多,因为派生类是由不同的func组合构造的。我必须将 func 实现代码的代码硬拷贝到派生类中,这不好。很难维护。
我想通过原始 func 代码使派生类可配置,这可能吗?
==================================================== ====================
我澄清了我的问题,装饰者确实可以解决这个问题。
interface A {
f1();
f2();
...
f20();
}
f1-20 的实现不是任意的,它们有固定的模式。f1() 有 3 种实现,例如 {1a}、{1b}、{1c}。f2() 有 2 种:{2a},{2b}。实现 A 的派生类只需要覆盖 3-5 左右的少量函数。如您所见,可能的派生类定义(随机选择一些 fn() 来覆盖并从每个 fn() 中选择一种实现)是一个组合,数量巨大。结果是固定 fn 的实现将被复制到每个地方。
装饰器通过将每个 fn 的实现(例如 {1a})放入接口 A 的装饰器来解决这个问题。因此,如果我们希望派生类仅通过 {1a}{2b} 覆盖 f1 和 f2,则组合 {1a}{2b} 装饰器到一个对象。关键是定义一个抽象类装饰器基础:
abstract class DecoratorBase : A {
A a;
DecoratorBase(A a){this.a=a;}
f1(){a.f1();}
f2(){a.f2();};
...
f20(){a.f20();};
}
并在base A中定义一些默认进程(如果没有默认的公共进程可以省略)
class BaseA {
f1(){} // no default code, do nothing
f5(){/*default code*/}
}
f1() 的第一种实现:
class F1A : DecoratorBase {
F1A(A a){super(a);}
f1(){super.f1();/*1a*/}
}
f2() 的第二种实现:
class F2B : DecoratorBase {
F2B(A a){super(a);}
f2(){super.f2();/*2b*/}
}
最后,将它们组合起来:
new F1A(new F2B(BaseA()));