現在、いくつかのコードリファクタリングを行っています。だから私は既存のinheritance
デザインをdecorator
デザインに置き換えました。しかし、私は複数のジェネリック医薬品に苦しんでいます(多分それは不可能かもしれません)。複数のジェネリックのデコレータパターン
私は、現時点では上記のデザインを持っています。実装された制約に対するクラスはIConstraint
です。これらの制約の具体的な実現は、SimpleConstraintA
とSimpleConstraintB
であり、どちらもClassA
の値をチェックしています。 Decorator
は制約を強化する。指定された値が範囲内にないときにチェックすべきではないいくつかの制約があります。 ClassA
は、DecoratorA
とDecoratorB
が対応できるように、インターフェイスIA
とIB
を実装しています。以下のように
デザインの使い方は次のとおりです。
Test classToCheck = new Test("test");
IConstraint<Test> constraint = new DecoratorA<>(new DecoratorB<>(new SimpleConstraint()));
boolean value = constraint.check(classToCheck);
それでは、私が欲しいのは、入力パラメータと異なる種類の異なる数のコードを使用することです。同様:
Test classToCheckA = new Test("testA");
Test classToCheckB = new Test("testB");
IConstraint<Test> constraint = new DecoratorA<>(new DecoratorB<>(new SimpleConstraint()));
boolean value = constraint.check(classToCheckA, classToCheckB);
または:
Test classToCheckA = new Test("testA");
// TestB does implement the same interfaces as Test
TestB classToCheckB = new TestB("testB");
IConstraint<Test> constraint = new DecoratorA<>(new DecoratorB<>(new SimpleConstraint()));
boolean value = constraint.check(classToCheckA, classToCheckB);
または:
Test classToCheckA = new Test("testA");
// TestB does implement the same interfaces as Test
TestB classToCheckB = new TestB("testB");
// TestC does implement the same interfaces as Test
TestC classToCheckC = new TestC("testC");
IConstraint<Test> constraint = new DecoratorA<>(new DecoratorB<>(new SimpleConstraint()));
boolean value = constraint.check(classToCheckA, classToCheckB, classToCheckC);
私はvarargs
、Lists
またはその代わりcheck(obj:T)
からT
のObject[]
を使用してみましたが、その後、私は常にキャストを必要とし、多くの例外処理(例えば、入力パラメータの数が正しいことが必要です)に満足できませんでした。
次のコードは私が試した一例です。 SimpleConstraint
に表示されているように、check
メソッドはタイプ(Test
)のみが許可されています。
public interface IConstraint<T extends ICheckable> {
public boolean check(T[] checkable);
}
public class SimpleConstraint implements IConstraint<Test> {
@Override
public boolean check(Test[] checkable) {
return true;
}
}
これは、上記のコードでは不可能である:入力パラメータと異なる種類の異なる数をサポートできるように
Test classToCheckA = new Test("testA");
// TestB does implement the same interfaces as Test
TestB classToCheckB = new TestB("testB");
IConstraint<Test> constraint = new DecoratorA<>(new DecoratorB<>(new SimpleConstraint()));
boolean value = constraint.check(classToCheckA, classToCheckB);
デザインのいくつかの改善がありますか?上記のコードで
を持っているだろう、あなたは上でより詳しく説明し、「しかし、私はいつものキャストと例外処理の多くを必要とする」ことはできますか?私は知っている、それは多くの時間が問題になるだろうが、コードを提供する必要があります - 誰かが試してみたい場合、彼/彼女は自分自身を作成する必要はありません... – Betlista
@Betlista私は完全に実装されていません'varargs'、' Lists'、 'Object []'を使って解決するので、コードは実行できません。 –
@Betlistaいくつかのサンプルコードを追加しました。 –