0

インターフェイスは、一連の関数func1からfunc20を定義します。これらの20の関数の一部のみを実装する多くの派生クラスがあります。funcの実装には独自のパターンがあります。たとえば、f1の実装には2種類、f2の実装には3種類があります。派生クラスは、インターフェイスで定義された約3〜5個の数値関数を実装し、それらの実装はすべて、定義された種類で選択されます。派生クラスのほとんどの関数は空です。つまり、外部モデルがインターフェイスを参照して呼び出すときに何もしません。オブジェクトに固定実装を作成し、それらを使用して派生クラスを構成するパターンはありますか?例:派生クラスD1はf2とf10を実装する必要があり、f2は3種類すべてから選択された第1種の実装を使用します。f10は、2種類すべてから選択した第2種の実装を使用します。

今の私の解決策は単純です。インターフェースから派生し、必要な関数をオーバーライドするだけですが、問題は、派生クラスが異なる関数の組み合わせによって構築されるため、関数の実装の増加が派生クラスよりもはるかに遅いことです。func実装コードのコードを派生クラスにハードコピーする必要がありますが、これは良くありません。維持するのは難しいです。

派生クラスをプリミティブ関数コードで構成可能にしたいのですが、可能ですか?

================================================== ===================

私は自分の問題を明確にしており、デコレータは確かにこれを解決できます。

interface A {
    f1();
    f2();
    ...
    f20();
}

f1-20の実装は任意ではなく、固定パターンです。f1()には、{1a}、{1b}、{1c}の3種類の実装があります。f2()には、{2a}、{2b}の2種類があります。Aを実装する派生クラスは、3〜5個程度の少数の関数をオーバーライドするだけで済みます。ご覧のとおり、可能な派生クラス定義(ランダムにオーバーライドするfn()を選択し、各fn()から実装の種類を選択)は組み合わせであり、その数は膨大です。結果は修正されました。fnの実装はどこにでもコピーされます。

デコレータは、{1a}などのすべてのfnの実装をインターフェイス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();};
}

そして、いくつかのデフォルトプロセスをベースAに定義します(デフォルトの共通プロセスがない場合、これは省略できます)

class BaseA {
    f1(){} // no default code, do nothing
    f5(){/*default code*/}
}

f1()の第1種の実装:

class F1A : DecoratorBase  {
    F1A(A a){super(a);}
    f1(){super.f1();/*1a*/}
}

f2()の第2種の実装:

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 に答える