0

私の現在のプロジェクトでは、すべてのセンサードライバーの統一されたインターフェイスを作成しようとしています。

たとえば、Temperature sensorそこからデータを取得するための温度センサードライバーがあります。

さて、私の問題は、独自のデータオブジェクトを持つ各センサーの応答です。次の温度センサーの例を書きました。センサードライバーのインターフェイスを統一するにはどうすればよいのでしょうか。プログラマーはSensorResonseのみを知っている必要があります(ではありませんTempSensorResponse)。

public class TempSensor implements Sensor {


    /**
     * Returns a SensorInfo object that describes this sensor.
     */
    @Override
    public TempSensorInfo getSensorInfo() {
        // TODO Auto-generated method stub
        return null;
    }

    /**
     * Asks the sensor for a (possibly old) datapoint. Synchronous: returns
     * immediately, even if that means returning an old value.
     */
    @Override
    public TempResponse getData() {
        // TODO Auto-generated method stub
        return null;
    }

    /**
     * Asks the sensor for a new datapoint. Asynchronous.
     *
     * @param handler A Handler object to be executed when the sensor has a
     * new value. If this Sensor is event-based, this method starts listening
     * for data, and calls the handler whenever new events are detected.
     */
    @Override
    public void getData(SensorListener handler) {
        // TODO Auto-generated method stub

    }

}

/ ** * SensorResponseは、センサーがデータを要求されるたびに*センサーが呼び出し先に渡す応答です。これは、この応答を生成したセンサーのSensorInfoなど、センサーデータ自体とそれに関するメタデータの両方を保持します。* /

public class TempResponse extends SensorResponse {


    public TempResponse(TempSensorInfo sensorInfo, TempSensorData payload) {
        super(sensorInfo, payload);
        // TODO Auto-generated constructor stub
    }

}
4

2 に答える 2

2

ジェネリックを使用する:

インターフェイス/基本クラスを作成します。

public interface ISensor 
    <I extends ISensor.SensorInfo, 
     R extends ISensor.SensorResponse, 
     L extends ISensor.SensorListener> 
{

    /**
    * Returns a SensorInfo object that describes this sensor.
    */
    public I getSensorInfo();

    /**
    * Asks the sensor for a (possibly old) datapoint. Synchronous: returns
    * immediately, even if that means returning an old value.
    */
    public R getData();

    /**
    * Asks the sensor for a new datapoint. Asynchronous.
    * 
    * @param handler
    *            A Handler object to be executed when the sensor has a new
    *            value. If this Sensor is event-based, this method starts
    *            listening for data, and calls the handler whenever new events
    *            are detected.
    */
    public void getData(L handler);

    public static class SensorInfo { }
    public static class SensorResponse { }
    public static class SensorListener { }
}

センサーにインターフェース/クラスを実装/拡張させます。

public class TemperatorSensor 
    implements ISensor 
        <TemperatorSensor.TemperatorInfo, 
         TemperatorSensor.TemperatorResponse, 
         TemperatorSensor.TemperatorListener> 
{

    @Override
    public TemperatorInfo getSensorInfo() {
        // TODO Auto-generated method stub
        return null;
    }

    @Override
    public TemperatorResponse getData() {
        // TODO Auto-generated method stub
        return null;
    }

    @Override
    public void getData(TemperatorListener handler) {
        // TODO Auto-generated method stub
    }

    public static final class TemperatorInfo extends ISensor.SensorInfo { }
    public static final class TemperatorResponse extends ISensor.SensorResponse { }
    public static final class TemperatorListener extends ISensor.SensorListener { }
}

ジェネリックを使用しない場合:

基本インターフェース/クラス

public interface ISensor {

    /**
     * Returns a SensorInfo object that describes this sensor.
     */
    public ISensor.SensorInfo getSensorInfo();

    /**
     * Asks the sensor for a (possibly old) datapoint. Synchronous: returns
     * immediately, even if that means returning an old value.
     */
    public ISensor.SensorResponse getData();

    /**
     * Asks the sensor for a new datapoint. Asynchronous.
     * 
     * @param handler
     *            A Handler object to be executed when the sensor has a new
     *            value. If this Sensor is event-based, this method starts
     *            listening for data, and calls the handler whenever new events
     *            are detected.
     */
    public void getData(ISensor.SensorListener handler);

    public static class SensorInfo { }
    public static class SensorResponse { }
    public static class SensorListener { }
}

拡張インターフェース/クラス

public class TemperatorSensor implements ISensor {

    @Override
    public SensorInfo getSensorInfo() {
        // TODO Auto-generated method stub
        return new TemperatorInfo();
    }

    @Override
    public SensorResponse getData() {
        // TODO Auto-generated method stub
        return new TemperatorResponse();
    }

    @Override
    public void getData(SensorListener handler) {
        if (handler instanceof TemperatorListener) {
            // TODO Auto-generated method stub
        }
    }

    public static final class TemperatorInfo extends ISensor.SensorInfo { }
    public static final class TemperatorResponse extends ISensor.SensorResponse { }
    public static final class TemperatorListener extends ISensor.SensorListener { }
}
于 2012-05-28T13:36:51.873 に答える
0

ほとんどの場合、Sensorクラス階層に加えてSensorResponseクラス階層を作成する必要があります。getData()メソッド(Sensor基本クラスで定義する必要があります)は、SensorResponseのインスタンスを返すように定義されます。

于 2012-05-28T13:20:47.390 に答える