某公司欲开发一套机房监控系统,如果机房达到某一指定温度,温度传感器(Thermosensor)将自动传递信号给各种响应设备,例如警示灯(caution light)将闪烁(flicker())、报警器(Annunciator)将发出警报(alarm())、安全逃生门(SecurityDoor)将自动开启(open())、隔热门(insulated door)将自动关闭(close())等,每一种响应设备的行为由专门的程序来控制。为了将来能够方便地引入新类型的响应设备,采用观察者模式和适配器模式设计并模拟实现该系统。

类图:

实现代码:

抽象观察目标类Subject :

package ObserveAndAdapterPattern;

 

import java.util.ArrayList;

 

public abstract class Subject {

    protected ArrayList<ResponseEquipment> responseEquipments = new ArrayList();

 

    public void  add(ResponseEquipment responseEquipment){

        responseEquipments.add(responseEquipment);

    }

 

    public void remove(ResponseEquipment responseEquipment){

        responseEquipments.remove(responseEquipment);

 

    }

    public abstract void trigger();

}

 


具体观察目标类Thermosensor 

package ObserveAndAdapterPattern;

 

public class Thermosensor extends Subject {

    @Override

    public void trigger() {

        for (ResponseEquipment responseEquipment: responseEquipments){

            responseEquipment.response();

        }

    }

}

 

抽象观察者(目标抽象类)ResponseEquipment 

package ObserveAndAdapterPattern;

 

public interface ResponseEquipment {

    public void response();

}

 

 

具体观察者(适配器)类AnnunciatorObserver 

package ObserveAndAdapterPattern;

 

public class AnnunciatorObserver implements ResponseEquipment{

  private Annunciator annunciator = new Annunciator();

 

    @Override

    public void response() {

        annunciator.alarm();

    }

}

具体观察者(适配器)类CautionLightObserver 

package ObserveAndAdapterPattern;

 

public class CautionLightObserver implements ResponseEquipment {

    private CautionLight cautionLight = new CautionLight();

    @Override

    public void response() {

        cautionLight.flicker();

    }

}

具体观察者(适配器)类InsulatedDoorObserver 

package ObserveAndAdapterPattern;

 

public class InsulatedDoorObserver implements ResponseEquipment {

    private InsulatedDoor insulatedDoor = new InsulatedDoor();

    @Override

    public void response() {

        insulatedDoor.close();

    }

}

 

 

具体观察者(适配器)类SecurityDoorObserver 

package ObserveAndAdapterPattern;

 

public class SecurityDoorObserver implements ResponseEquipment {

    private SecurityDoor securityDoor = new SecurityDoor();

    @Override

    public void response() {

        securityDoor.open();

    }

}

 

适配者类Annunciator 

package ObserveAndAdapterPattern;

 

public class Annunciator {

    public void alarm(){

        System.out.println("报警器发出警报");

    }

}

适配者类CautionLight 

package ObserveAndAdapterPattern;

 

public class CautionLight {

    public void flicker(){

        System.out.println("警示灯闪烁");

    }

}

 

适配者类InsulatedDoor 

package ObserveAndAdapterPattern;

 

public class InsulatedDoor {

    public void close(){

        System.out.println("隔热门自动关闭");

    }

}

 

适配者类SecurityDoor 

package ObserveAndAdapterPattern;

 

public class SecurityDoor {

    public void open(){

        System.out.println("安全逃生门自动开启");

    }

}

 

客户端Client :

package ObserveAndAdapterPattern;

public class Client {

    public static void main(String[] args) {

        ResponseEquipment annunciatorObserver,cautionLightObserver,insulateDoorObserver,securityDoorObserver;

        annunciatorObserver = new AnnunciatorObserver();

        cautionLightObserver = new CautionLightObserver();

        insulateDoorObserver = new InsulatedDoorObserver();

        securityDoorObserver = new SecurityDoorObserver();

 

        Subject thermosensor = new Thermosensor();

        thermosensor.add(annunciatorObserver);

        thermosensor.add(cautionLightObserver);

        thermosensor.add(insulateDoorObserver);

        thermosensor.add(securityDoorObserver);

        //当温度超过一定温度

        thermosensor.trigger();

    }

}



Logo

北京人形旗下天工造物具身智能开源社区,聚焦具身天工与慧思开物两大平台

更多推荐