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());
}
}
}