配置函数覆盖模式是否有模式?

时间:2012-10-15 07:13:15

标签: design-patterns

接口定义了一系列函数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()));

1 个答案:

答案 0 :(得分:1)

嗯,装饰师模式似乎合适吗?

http://en.wikipedia.org/wiki/Decorator_pattern

可能与Factory和/或Builder模式结合使用。