0

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

1 回答 1

1

嗯,装饰器模式似乎合适?

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

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

于 2012-10-15T07:24:27.800 回答