接口定义了一系列函数func1到func20。有许多派生类只实现这20个函数的一部分。 func的实现有自己的模式,例如:f1的实现有2种,f2的实现有3种。派生类将实现在接口中定义的大约3到5个数字func,并且所有这些实现都是在定义的类型中选择的。派生类中的大多数func为空意味着当外部模型通过引用接口调用它时什么也不做。 是否有一种模式可以对对象进行固定实现并使用它们来配置派生类?例如:派生类D1需要实现f2& f10,f2使用从所有3种中选择的第一种实现方式。 f10使用从所有两种中选择的第二种实现。
我现在的解决方案很简单:只从接口派生并覆盖它需要的函数,但问题是:func实现的增加比派生类慢得多,因为派生类通过不同的func组合构造。我必须将func实现代码的代码硬拷贝到派生类中,这并不好。这很难维持。
我想通过原始函数代码配置派生类,是否可能?
=============================================== ======================
我澄清了我的问题,装饰师确实可以解决这个问题。
interface A {
f1();
f2();
...
f20();
}
f1-20的实现并不是随意的,它们有固定的模式。 f1()有3种实现,比如{1a},{1b},{1c}。 f2()有两种:{2a},{2b}。实现A的派生类只需要覆盖3-5左右的小数字函数。正如您所看到的,可能的派生类定义(随机选择一些fn()来覆盖并从每个fn()中选择一种实现)是一种组合,数字很大。结果是固定fn的实现将被复制到每个地方。
Decorator通过将每个fn的实现(如{1a})放入接口A的装饰器中来解决这个问题。因此,如果我们希望派生类只覆盖f1& f2 by {1a} {2b},将{1a} {2b}装饰器组成一个对象。关键是定义一个抽象类装饰器基础:
abstract class DecoratorBase : A {
A a;
DecoratorBase(A a){this.a=a;}
f1(){a.f1();}
f2(){a.f2();};
...
f20(){a.f20();};
}
并将一些默认流程定义到基础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()));
答案 0 :(得分:1)