Java 观察者模式(温度、压力和湿度)

Java 观察者模式(温度、压力和湿度),java,Java,我需要你们的帮助,在我的观察者模式中,当温度、压力或湿度被更新时,我应该更新。代码如下: public static void main(String[] args) { TemperatureSensor t = new TemperatureSensor(); PressureSensor p = new PressureSensor(); HumiditySensor h = new HumiditySensor(); WeatherObserver w =

我需要你们的帮助,在我的观察者模式中,当温度、压力或湿度被更新时,我应该更新。代码如下:

public static void main(String[] args) {
    TemperatureSensor t = new TemperatureSensor();
    PressureSensor p = new PressureSensor();
    HumiditySensor h = new HumiditySensor();
    WeatherObserver w = new WeatherObserver();
    w.addSubject(t);
    w.addSubject(p);
    w.addSubject(h);
    t.setTemperature(28);
    System.out.println("-------------------------------");
    p.setPressure(200);
    System.out.println("-------------------------------");
    h.setHumidity(89);
}

class Subject {
    private List<Observer> observers=new ArrayList<Observer>();
    public void attachObserver(Observer observer) {
    this.observers.add(observer);
    }
    public void detachObserver(Observer observer) {
    this.observers.remove(observer);
    }
    public void notifyObservers() {
    for (Observer observer: this.observers)
            observer.update(this);
    }
}

class TemperatureSensor extends Subject {
    private double temperature;
    public double getTemperature() { return this.temperature; }    
    public void setTemperature(double temp) {
    this.temperature=temp;         
       this.notifyObservers();  // don't forget to do this!
    }
}

class PressureSensor extends Subject {
    private double pressure;
    public double getPressure() { return this.pressure; }    
    public void setPressure(double press) {
    this.pressure=press;         
    this.notifyObservers();  // don't forget to do this!
    }
}

class HumiditySensor extends Subject {
    private double humidity;
    public double getHumidity() { return this.humidity; }    
    public void setHumidity(double humid) {
    this.humidity=humid;         
        this.notifyObservers();  // don't forget to do this!
    }
}

abstract class Observer {
    public Observer(Subject subject) {
    subject.attachObserver(this);
    }
    abstract public void update(Subject subject);
}

class WeatherObserver extends Observer {
    public WeatherObserver(Subject subject) {
    super(subject);
    }

    public void addSubject(Subject subject){
        subject.attachObserver(this);
    }

    public void update(Subject subject) {
        TemperatureSensor temp=(TemperatureSensor)subject;        
        System.out.println("Temperature: " + temp.getTemperature() + " Celcius");
        /*PressureSensor press=(PressureSensor)subject;
        System.out.println("the temp is: " + press.getPressure() + " Pascal");
        HumiditySensor humid=(HumiditySensor)subject;
        System.out.println("the temp is: " + humid.getHumidity());*/
    }    
}
publicstaticvoidmain(字符串[]args){
温度传感器t=新的温度传感器();
压力传感器p=新的压力传感器();
湿度传感器h=新的湿度传感器();
WeatherObserver w=新的WeatherObserver();
w、 addSubject(t);
w、 addSubject(p);
w、 受试者(h);
t、 设定温度(28);
System.out.println(“------------------------------------”;
p、 设定压力(200);
System.out.println(“------------------------------------”;
h、 设定湿度(89);
}
班级科目{
私有列表观察员=新的ArrayList();
public void attachObserver(观察者){
this.observer.add(observer);
}
公众观察员(观察员){
这个。观察员。移除(观察员);
}
公营机构({
for(观察员:this.Observer)
观察员:更新(本);
}
}
类温度传感器扩展主题{
私人双温;
public double getTemperature(){返回this.temperature;}
公共真空设定温度(双温){
这个。温度=温度;
this.notifyObservators();//别忘了这样做!
}
}
类压力传感器{
私人双重压力;
public double getPressure(){返回this.pressure;}
公共真空设定压力(双重压力){
压力=压力;
this.notifyObservators();//别忘了这样做!
}
}
类湿度传感器扩展主题{
私人双湿度;
public-double-get湿度(){返回this.湿度;}
公共空间设置湿度(双湿){
这个。湿度=潮湿;
this.notifyObservators();//别忘了这样做!
}
}
抽象类观测器{
公众观察员(主题){
subject.attachObserver(本);
}
摘要公共空间更新(主题);
}
类WeatherObserver扩展了Observer{
公共气象观察员(主题){
超级(主题);
}
公共科目(科目){
subject.attachObserver(本);
}
公共无效更新(主题){
温度传感器温度=(温度传感器)对象;
System.out.println(“温度:+temp.getTemperature()+Celcius”);
/*压力传感器压力=(压力传感器)主体;
System.out.println(“温度为:“+press.getPressure()+”Pascal”);
湿度传感器湿度=(湿度传感器)主体;
System.out.println(“温度为:“+weam.get湿度()”)*/
}    
}

如何在更新方法的末尾更新压力和湿度?是否有多个主题?请在这方面指导我

基本上,您正在创建一个新的观察者主题列表,这应该是所有人的共同点。 这是个错误

public static void main(String[] args) {
    List<Observer> observers = new ArrayList<Observer>();
    TemperatureSensor t = new TemperatureSensor(observers);
    PressureSensor p = new PressureSensor(observers);
    HumiditySensor h = new HumiditySensor(observers);
    WeatherObserver w = new WeatherObserver();
    w.addSubject(t);
    w.addSubject(p);
    w.addSubject(h);
    t.setTemperature(28);
    System.out.println("-------------------------------");
    p.setPressure(200);
    System.out.println("-------------------------------");
    h.setHumidity(89);
}

class Subject {
protected List<Observer> observers;

public Subject(List<Observer> observers) {
    this.observers = observers; // you need common observer so that you can
                                // receive callback
}

public void attachObserver(Observer observer) {
    this.observers.add(observer);
}

public void detachObserver(Observer observer) {
    this.observers.remove(observer);
}

public void notifyObservers() {
    for (Observer observer : this.observers)
        observer.update(this);
}
}

class TemperatureSensor extends Subject {

public TemperatureSensor(List<Observer> observers) {
    super(observers);
}
private double temperature;

public double getTemperature() {
    return this.temperature;
}

public void setTemperature(double temp) {
    this.temperature = temp;
    this.notifyObservers(); // don't forget to do this!
}
}

class PressureSensor extends Subject {
public PressureSensor(List<Observer> observers) {
    super(observers);
}
private double pressure;

public double getPressure() {
    return this.pressure;
}

public void setPressure(double press) {
    this.pressure = press;
    this.notifyObservers(); // don't forget to do this!
}
}

class HumiditySensor extends Subject {

public HumiditySensor(List<Observer> observers) {
    super(observers);
}
private double humidity;

public double getHumidity() {
    return this.humidity;
}

public void setHumidity(double humid) {
    this.humidity = humid;
    this.notifyObservers(); // don't forget to do this!
}
}

abstract class Observer {
// public Observer(Subject subject) {
// subject.attachObserver(this);
// }

abstract public void update(Subject subject);
}

class WeatherObserver extends Observer {
// public WeatherObserver(Subject subject) {
// super(subject);
// }

public void addSubject(Subject subject) {
    subject.attachObserver(this);
}

public void update(Subject subject) {
    System.out.println("updated");
    // TemperatureSensor temp = (TemperatureSensor) subject;
    // System.out.println("Temperature: " + temp.getTemperature() + " Celcius");
    /*
     * PressureSensor press=(PressureSensor)subject;
     * System.out.println("the temp is: " + press.getPressure() +
     * " Pascal"); HumiditySensor humid=(HumiditySensor)subject;
     * System.out.println("the temp is: " + humid.getHumidity());
     */
}
}
publicstaticvoidmain(字符串[]args){
列表观察者=新的ArrayList();
温度传感器t=新的温度传感器(观察员);
压力传感器p=新的压力传感器(观察员);
湿度传感器h=新的湿度传感器(观察员);
WeatherObserver w=新的WeatherObserver();
w、 addSubject(t);
w、 addSubject(p);
w、 受试者(h);
t、 设定温度(28);
System.out.println(“------------------------------------”;
p、 设定压力(200);
System.out.println(“------------------------------------”;
h、 设定湿度(89);
}
班级科目{
受保护名单观察员;
公共主题(观察员名单){
this.observators=observators;//您需要公共观察者,以便
//接收回拨
}
public void attachObserver(观察者){
this.observer.add(observer);
}
公众观察员(观察员){
这个。观察员。移除(观察员);
}
公营机构({
for(观察员:this.Observer)
观察员:更新(本);
}
}
类温度传感器扩展主题{
公共温度传感器(列表观察员){
超级观察员;
}
私人双温;
公共双温度(){
返回该温度;
}
公共真空设定温度(双温){
这个温度=温度;
this.notifyObservators();//别忘了这样做!
}
}
类压力传感器{
公共压力传感器(观察员名单){
超级观察员;
}
私人双重压力;
公众双重压力{
返回这个压力;
}
公共真空设定压力(双重压力){
压力=压力;
this.notifyObservators();//别忘了这样做!
}
}
类湿度传感器扩展主题{
公共湿度传感器(观察员名单){
超级观察员;
}
私人双湿度;
公共双通道{
把这个还给我。湿度;
}
公共空间设置湿度(双湿){
湿度=潮湿;
this.notifyObservators();//别忘了这样做!
}
}
抽象类观测器{
//公众观察员(主题){
//subject.attachObserver(本);
// }
摘要公共空间更新(主题);
}
类WeatherObserver扩展了Observer{
//公共气象观察员(主题){
//超级(主题);
// }
公共科目(科目){
subject.attachObserver(本);
}
公共无效更新(主题){
系统输出打印项次(“更新”);
//温度传感器温度=(温度传感器)对象;
//System.out.println(“温度:+temp.getTemperature()+Celcius”);
/*
*压力传感器压力=(压力传感器)主体;
*System.out.println(“温度为:”+press.getPressure()+
*“Pascal”);湿度传感器潮湿=(湿度传感器)主体;
*System.out.println(“温度为:“+weam.get湿度()”);
*/
}
}

希望这能解决您的问题

您只需要知道在更新方法中接收到的是什么类型的对象,要做到这一点,您可以使用关键字instanceof
class WeatherObserver extends Observer {
   public WeatherObserver(Subject subject) {
      super(subject);
   }

   public void addSubject(Subject subject){
      subject.attachObserver(this);
   }

   @Override
   public void update(Subject subject) {
      if (subject instaceof TemperatureSensor){
          TemperatureSensor temp=(TemperatureSensor)subject;        
          System.out.println("Temperature: " + temp.getTemperature() + " Celcius");
      } else if (subject instaceof PressureSensor ){
          PressureSensor press=(PressureSensor)subject;
          // use press
      } else if (subject instaceof HumiditySensor ){
          HumiditySensor humid=(HumiditySensor)subject;
          // use humid
      } else {
          throw new ClassCastExeption("Unexpected instance of Subject: " + subject.getClass());
      }
    }    
 }