1

サブクラスに引数を渡すためのデザインパターンが必要ですが、引数は異なります。

1)無制限のinstanceofチェック:問題:a)遅いb)読み取れない。

Component a ;
if ( a instanceof SimpleComponent)
{
   (SimpleComponent)a.do();
}
else if ( a instanceof UnitComponent)
{
   (UnitComponent)a.do( unit );
}
else if ( a instanceof BuildingComponent)
{
   (BuildingComponent)a.do( building );
}

1a)セッターを使用する:上記と同じように、代わりにdo(X)、set(X)を呼び出し、無制限のinstanceofチェックが必要です。

2)巨大なswitchステートメント:問題:a)まだインスタンスをキャストする必要があります。b)読めない。

3)コンストラクターに変数を渡します。問題:アプリケーションの存続期間中にその変数を再度変更することはできません。特定の不明な.set(X)メソッドを呼び出す必要があります。

4)すべての解放されていない変数をスーパークラスに配置します。

   Component
   {
     Unit unit;
     Building building;
     String i_can_pass_strings_0;
     String i_can_pass_strings_1;
     String i_can_pass_strings_2;
     int    i_am_allowed_to_pass_a_single_int_now;
   }

これは、関数間で変数を渡す際にグローバル変数を使用するようなものです。ガベージコレクションの問題である、200〜300の無関係な変数を持つクラスで終了します。また、あなたはそれを考えさえするためにトローリングしているに違いありません、クラスは大きな読めないゴミ箱として終わります。

5)上記のComponentクラスの名前がComponentOptionsに変更されました(まだごみ箱です)。

interface Component
{
   do ( ComponentOptions );
}

解決策:少なくとも今は、do()をどのように呼び出すかを考える必要はありません。同じように呼ばれます。

問題:a)呼び出し側が渡す変数を決定する代わりに、受信側サブクラスは変数の読み取り方法を決定する必要があります。この場合、ガーベースのゴミ箱であるComponentOptionsを使用します。

6)コンポーネントパターン:コンポーネントを持っている/取得します。

class UnitComponent implement Component
{
   public void do( ComponentOptions componentOptions )
   {
      if ( hasComponent( Unit.class )
      {
         Unit unit = componentOptions.getComponent( Unit.class );
         doStuff( unit ) ;
      }
   }
}

a)読み取り可能

質問:1)この問題を解決するための別のデザインパターンはありますか、それともソリ​​ューション6がこれを解決するための最良の方法ですか?

4

1 に答える 1

1

スパムinstanceofの既知の代替物の1つはVisitorパターンです-ここを見てください:http://www.refactoring.com/catalog/replaceConditionalWithVisitor.html

この質問も読むことができますJavaでinstanceofを回避する

于 2012-07-04T19:53:01.947 に答える