4

オブザーバー パターンのオブザーバーは常に同じ TYPE のオブジェクトを観察する必要がありますか? まったく関係のない、さまざまな種類のクラスのさまざまなオブジェクトを 1 つのオブザーバーが観察しても大丈夫ですか?

例 - Observer は CarDashBoard で、Observable は FuelTank、Speedometer、EngineThermometer、CarBattery などです。観測されるパラメータは、それぞれ、fuelLevel、speed、temperatureOfEngine、powerLevel です。


複数の無関係なタイプを観察する場合、instanceof() メソッドを使用して、オブザーバーに通知したオブザーバブルのクラスを確認する必要があります。ただし、このリンクによると、これは悪いアプローチのようです - http://www.javapractices.com/topic/TopicAction.do?Id=31

instanceof に関連する別のリンク - http://blog.joda.org/2007/01/java-language-dynamic-instanceof_7967.html

そこで、代わりに getClass() メソッドを使用し、渡された Observable に従って実行するアクションを決定することにしました。この目的で getClass() を使用しても安全ですか?

他の選択肢はありますか?

4

2 に答える 2

3

ポリモーフィズムを使用できます。たとえば、次を拡張する抽象クラスがあるとしますObservable

import java.util.Observable;

public abstract class DashboardDataSource extends Observable {

    public abstract int getLevel();
}

次に、継承する 2 つのクラスがありDashboardDataSourceます (実際には、必要な数のクラスがあります。例として 2 つを使用しています)。

public class FuelLevel extends DashboardDataSource {

    public void saySomething(){
        setChanged();
        notifyObservers();
    }
    @Override
    public int getLevel() {
        // TODO Auto-generated method stub
        return 50;
    }
}

public class BatteryLevel extends DashboardDataSource { 

    public void saySomething(){
        setChanged();
        notifyObservers();
    }

    @Override
    public int getLevel() {
        // TODO Auto-generated method stub
        return 20;
    }
}

Dashboard次に、次のようにすることができます。

public class Dashboard implements Observer {

    @Override
    public void update(Observable o, Object arg) {
        DashboardDataSource d = (DashboardDataSource) o;
        System.out.println (d.getLevel());

    }
}

この場合、 を にキャストし、その抽象メソッドの実装を呼び出すだけです。これObservable oDashboardDataSource、DashboardDataSource が通知を行っているものDashboard(この例では aFuelLevelまたはBatteryLevel)に固有です。

于 2013-03-31T00:47:16.297 に答える
2

使用しない理由は、instanceofポリモーフィズムの使用に関するハックであるためです。それは機能しますが、よりオブジェクト指向のソリューションを考え出すことをお勧めします。使用しgetClassても同じ問題があります。

FuelTank、Speedometerなどに1つずつ、複数のオブザーバーを作成し、CarDashboardを更新させると思います。このようなもの。

public class CarDashboard
{
    public int currentSpeed;
    public int fuelPercentage;    
    //etc...
}

public class FuelObserver extends Observer
{
   private CarDashboard dashboard;

   public FuelObserver(CarDashboard dashboard)
   {
      this.dashboard = dashboard;
   }

   public void update(Observable fuelTank, Object fuelLevel)
   {
       this.dashboard.fuelPercentage = (int)fuelLevel;
   }
}

//etc..
于 2013-03-31T00:43:26.767 に答える