用AspectJ增强设计模式上
适配器模式
我要详细考虑的第一个模式就是适配器模式。适配器模式完全是关于兼容性的。这个模式允许类与其他原来由于接口不兼容而无法交互的类进行交互。要在 Java 代码中实现适配器,需要用特殊的适配器类包装目标类,适配器类能把目标类的 API 转换成客户想要的 API,或者转换成能够更容易利用的 API。
设置:提供一个聚合的传感器读取器
假设现在要设计一个航天器,则需要提供一个读取器,读取航天器上所有关键传感器。由于是在扩展现有系统,所以对于每个要访问的传感器而言,都存在方便的 Java 类。例如,可以用以下类访问温度计:
我要详细考虑的第一个模式就是适配器模式。适配器模式完全是关于兼容性的。这个模式允许类与其他原来由于接口不兼容而无法交互的类进行交互。要在 Java 代码中实现适配器,需要用特殊的适配器类包装目标类,适配器类能把目标类的 API 转换成客户想要的 API,或者转换成能够更容易利用的 API。
设置:提供一个聚合的传感器读取器
假设现在要设计一个航天器,则需要提供一个读取器,读取航天器上所有关键传感器。由于是在扩展现有系统,所以对于每个要访问的传感器而言,都存在方便的 Java 类。例如,可以用以下类访问温度计:
public class TemperatureGauge { public int readTemperature() { //accesses sensor internals } }
可以用以下类访问辐射传感器:
public class RadiationDetector { public double getCurrentRadiationLevel(){ //read radiation somehow } }
这些传感器类中有一些是其他团队成员编写的,有一些是第三方供应商编写的。现在想要做的是提供一个显示方式,显示每个传感器的状态,这样司令官只要看一眼,就知道飞船是否有问题。以下是所需要功能的一个示例。(实际的显示可能包含闪烁的红灯和高音喇叭,但现在我们只显示文本。)
Readout:
Sensor 1 status is OK
Sensor 2 status is OK
Sensor 3 status is BORDERLINE
Sensor 4 status is DANGER!
可以用以下方法实现上述显示:
public static void main(String[] args){ RadiationDetector radiationDetector = //find critical detector TemperatureGauge gauge = //get exhaust nozzle gauge List allSensors = new ArrayList(); allSensors.add(radiationDetector); allSensors.add(gauge); int count = 1; for (Sensor sensor : allSensors) { //How to read each type of sensor...? } }
目前为止,一切顺利。但是怎样才能不使用丑陋的 if(sensor instanceof XXX) 检测就能读出每个传感器呢?选项将修改每个传感器类,让它们拥有 getStatus() 方法,以便解释传感器的读取操作,并返回 String,如下所示。
if(this.readTemperature() > 160){ return "DANGER"; } return "OK"
这样做会将一些不相关的状态显示代码带到多个类当中,增加它们的复杂性。而且,可能存在一些实际限制 (例如必须重新编译第三方类)。这就是适配器模式发挥作用的地方。
0
相关文章