インターフェイスは、一連の関数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()));