Java 传感器驱动程序中的统一接口
在我目前的项目中,我试图为所有传感器驱动程序制作一个统一的接口 例如,Java 传感器驱动程序中的统一接口,java,design-patterns,Java,Design Patterns,在我目前的项目中,我试图为所有传感器驱动程序制作一个统一的接口 例如,温度传感器有一个温度传感器驱动程序从中获取数据 它 现在,我的问题是每个传感器的响应都有自己的数据对象。我已经写了以下温度传感器的例子。如何使传感器驱动程序接口统一,使程序员只知道SensorResonse(而不是TempSensorResponse) /** *SensorResponse是传感器在任何时候传递给被调用方的响应 *它被要求提供一些数据。它本身携带传感器数据 *有关它的一些元数据,例如生成的传感器的Sensor
温度传感器
有一个温度传感器驱动程序从中获取数据
它
现在,我的问题是每个传感器的响应都有自己的数据对象。我已经写了以下温度传感器的例子。如何使传感器驱动程序接口统一,使程序员只知道SensorResonse(而不是TempSensorResponse
)
/**
*SensorResponse是传感器在任何时候传递给被调用方的响应
*它被要求提供一些数据。它本身携带传感器数据
*有关它的一些元数据,例如生成的传感器的SensorInfo
*这是我的回答。
*/
除了传感器类层次结构外,您很可能还必须创建传感器响应类层次结构。getData()方法(应在传感器基类中定义)将被定义为返回SensorResponse的实例。使用泛型: 创建一个接口/基类
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 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 { }
}
谢谢Brady,我用更多的代码编辑了这个问题。它包括由TemperatureResponse扩展的SensorResponse。泛型自1.5(2004)以来一直是Java的一部分,但我将添加一个非泛型实现。我认为问题仍然存在。开发人员必须知道,温度传感器以温度响应的形式发送数据。我的要求是开发人员不应该关心这种复杂性。他们应该只知道任何传感器都会在sensorResponse(甚至不是TempeatureResponse)中发送数据。我看不出这一要求。开发人员要么对扩展ISensor的类调用getData(),该类将返回SensorResponse,要么将自己添加为扩展ISensor的类的侦听器,在该类中,他们将获得ISensor.oh中定义的回调类型。。谢谢你,贾斯汀。我明白你的意思。再次感谢您的时间和努力。
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 { }
}