1

次のシナリオを設計するためにどのパターンを使用するかについて混乱しています。

Interface GearBox {
   int upshift();
   int downshift();
   int reverse();
}

AutoGearBox implements GearBox{...}
ManualGearBox implements GearBox{...}

ここで、階層に DualClutchGearBox を追加します。以前のギアボックスはすべてシングル クラッチです。どうすればそれを行うことができますか?

デコレータあり -->

DualClutchDecorator implements GearBox{
     DualClutchDecorator(GearBox box){...}
}

ブリッジあり -->

GearBox{
   GearBoxImpl impl;
   ....
}

AutoGearBox implements GearBox{...}
ManualGearBox implements GearBox{...}

abstract class GearBoxImpl{}
SingleClutchImpl extends GearBoxImpl{...}
DualClutchImpl extends GearBoxImpl{...}

どちらが優れているか、またその理由は何ですか?

4

3 に答える 3

5

デコレータは、デコレートするオブジェクトのインターフェイスと一致する必要があります。これを念頭に置いて、インターフェイスに違反することなく、装飾されたオブジェクトに追加の動作を追加できます。デコレータのインターフェイスは、オブジェクトに追加の機能を提供できることに注意してください。

一方、ブリッジにはこの制限はありません。クライアントに面しているインターフェースは、基盤となり、実装を提供しているコンポーネントとは異なる場合があります。これは、クライアントのインターフェースと実際の実装の間のブリッジを形成します。

于 2012-11-10T20:21:30.060 に答える
3

これらのパターンのいずれかを使用するかどうかはわかりません。3番目の具象クラスを作成したくない理由はありますか?

動作を動的に変更する必要がある場合は、Decorator を使用します。私が考えることができる主な例の 1 つは、Java の InputStreamReader です。必要なケースに合わせて装飾されたリーダーを作成でき、それらは同じインターフェイスに準拠しています

// I need to read lines from a file
Reader r = new BufferedReader(new InputStreamReader(new FileInputStream(file)));

// Or I want to read lines from a byte array and track the line numbers
Reader r = new LineNumberReader(new InputStreamReader(new ByteArrayInputStream(bytes)));

したがって、デコレータのアイデアは、デコレータを追加することで実行時の動作を変更できるということです。これは、私が理解していることから、あなたがやろうとしていることではありません。DualClutch は特定の動作を示します。その場で変更する必要はありません。

ブリッジからの素晴らしいケースも見当たりませんが、それはあなたの特定のケースに依存すると思います. 私が言ったように、DualClutch は静的な動作をするだけで、自動車にはそれがあるかどうかのどちらかです。単純な具象クラスでうまくいくようです。

于 2012-11-10T21:24:58.557 に答える
1

場合によります。

あなたのインターフェイスは、ドライバーの観点からインターフェイスを定義していますか? ギアボックスの一般的な機能 (ギアを変更する機能!) を抽象化しようとしていますか?

オートとマニュアルのギアボックスは実際にはまったく同じ機能を持っていないため、同じインターフェイスを共有しない可能性があることに注意してください (たとえば、マニュアルのギアボックスでは 5 速から 3 速に直接ブロック シフトできますが、ほとんどの場合はそうではありません)。自動車 - および自動車には、手動ギアボックスでは必要のないキックダウン機能がある場合があります)。

逆に、デュアル クラッチ ギアボックスは、インターフェースの点ではシングル クラッチ ギアボックスと区別がつかない場合があり、実装のみが異なります。

于 2012-11-10T20:04:51.753 に答える