23种设计模式之观察者模式(水文站)
package com.company.learn.DesignPattern.ObserverPattern;
public class WaterDepartment implements Observer {
Observable subject;
double waterVelocity;
double waterDischarge;
WaterDepartment(Observable subject){
this.subject = subject;
subject.addObserver(this);
}
public void update(Observable subject, Object arg) {
if (subject instanceof WaterMessStation){
WaterMessStation mess = (WaterMessStation) subject;
waterDischarge = mess.getWaterDischarge();
waterVelocity = mess.getWaterVelocity();
System.out.println("水的流速为:"+waterVelocity+",");
System.out.println("流量为:"+waterDischarge);
}
}
}
package com.company.learn.DesignPattern.ObserverPattern;
import java.util.Vector;
public class Observable {
private Vector<Observer> obs = new Vector<>();
private boolean changed;
public synchronized void addObserver(Observer o){
if( o == null){
throw new NullPointerException();
}
if (!obs.contains(o)) obs.addElement(o);
}
protected synchronized void setChanged(){
changed = true;
}
protected synchronized void clearChanged(){
changed = false;
}
public synchronized boolean hasChanged(){
return changed;
}
public void notifyObservers(Object ojbs){
Object[] objarr;
synchronized (this){
if (!changed) return;
objarr = obs.toArray();
clearChanged();
for (int i=objarr.length-1;i>=0;i--){
( (com.company.learn.DesignPattern.ObserverPattern.Observer)objarr[i]).update(this,ojbs);
}
}
}
public void notifyObservers(){
}
}
package com.company.learn.DesignPattern.ObserverPattern;
public interface Observer {
void update(Observable o,Object arg);
}
package com.company.learn.DesignPattern.ObserverPattern;
public class WaterMessStation extends Observable {
double waterVelocity;
double waterDischarge ;
public double getWaterVelocity() {
return waterVelocity;
}
public double getWaterDischarge() {
return waterDischarge;
}
public void giveMessage(double waterVelocity,double waterDischarge){
if (this.waterDischarge != waterDischarge || this.waterVelocity != waterVelocity)
this.waterDischarge = waterDischarge;
this.waterVelocity = waterVelocity;
setChanged();
notifyObservers(this);
}
}
package com.company.learn.DesignPattern.ObserverPattern;
public class WaterDepartment implements Observer {
Observable subject;
double waterVelocity;
double waterDischarge;
WaterDepartment(Observable subject){
this.subject = subject;
subject.addObserver(this);
}
public void update(Observable subject, Object arg) {
if (subject instanceof WaterMessStation){
WaterMessStation mess = (WaterMessStation) subject;
waterDischarge = mess.getWaterDischarge();
waterVelocity = mess.getWaterVelocity();
System.out.println("水的流速为:"+waterVelocity+",");
System.out.println("流量为:"+waterDischarge);
}
}
}