目录
上述代码 GitHub 地址:https://github.com/baicun/designPatterns
观察者模式:
对象之间多对一依赖的一种设计方案,被依赖的对象为Subject,依赖的对象为Observer,Subject通知Observer变化。
观察者模式优点:
第一、观察者模式在被观察者和观察者之间建立一个抽象的耦合。被观察者角色所知道的只是一个具体观察者列表,每一个具体观察者都符合一个抽象观察者的接口。被观察者并不认识任何一个具体观察者,它只知道它们都有一个共同的接口。
由于被观察者和观察者没有紧密地耦合在一起,因此它们可以属于不同的抽象化层次。如果被观察者和观察者都被扔到一起,那么这个对象必然跨越抽象化和具体化层次。
第二、观察者模式支持广播通讯。被观察者会向所有的登记过的观察者发出通知,
观察者模式应用:
Spring ApplicationContext 机制中的观察者模式
JDK 委托事件模型DEM中的观察者模式
观察者实例:
类图:
观察者接口:
public interface Observer {
public void update(float mTemperature, float mPresure, float mHumidity);
}
A观察者实现类:
public class CurrentConditionsA implements Observer{
private float mTemperature;
private float mPresure;
private float mHumidity;
public void update(float mTemperature, float mPresure, float mHumidity){
this.mTemperature = mTemperature;
this.mPresure = mPresure;
this.mHumidity = mHumidity;
display();
}
public void display(){
System.out.println("今天的温度:"+mTemperature);
System.out.println("今天的气压:"+mPresure);
System.out.println("今天的湿度:"+mHumidity);
}
}
B观察者实现类:
public class CurrentConditionsB implements Observer{
private float mTemperature;
private float mPresure;
private float mHumidity;
public void update(float mTemperature, float mPresure, float mHumidity){
this.mTemperature = mTemperature;
this.mPresure = mPresure;
this.mHumidity = mHumidity;
display();
}
public void display(){
System.out.println("明天的温度:"+mTemperature);
System.out.println("明天的气压:"+mPresure);
System.out.println("明天的湿度:"+mHumidity);
}
}
被观察者接口:
public interface Subject {
//观察者注册
public void registerObserver(Observer observer);
// 观察者移除
public void removeObserver(Observer observer);
// 观察者通知
public void notifyObserver();
}
被观察者接口实现:
public class WeatherData implements Subject {
private float mTemperature;
private float mPresure;
private float mHumidity;
private ArrayList<Observer> observerArrays;
public WeatherData(){
observerArrays = new ArrayList<Observer>();
}
public float getmTemperature() {
return mTemperature;
}
public void setmTemperature(float mTemperature) {
this.mTemperature = mTemperature;
}
public float getmPresure() {
return mPresure;
}
public void setmPresure(float mPresure) {
this.mPresure = mPresure;
}
public float getmHumidity() {
return mHumidity;
}
public void setmHumidity(float mHumidity) {
this.mHumidity = mHumidity;
}
public void dataChange(){
notifyObserver();
}
public void setData(float mTemperature, float mPresure, float mHumidity){
this.mTemperature = mTemperature;
this.mPresure = mPresure;
this.mHumidity = mHumidity;
dataChange();
}
@Override
public void registerObserver(Observer observer) {
observerArrays.add(observer);
}
@Override
public void removeObserver(Observer observer) {
if(observerArrays.contains(observer)){
observerArrays.remove(observer);
}
}
@Override
public void notifyObserver() {
for(Observer obs : observerArrays){
obs.update(getmTemperature(),getmPresure(),getmHumidity());
}
}
}
通过通知接口,实现观察者通知
测试类:
public class mainTest {
public static void main(String[] args){
WeatherData weatherData = new WeatherData();
CurrentConditionsA currentConditionsA = new CurrentConditionsA();
CurrentConditionsB currentConditionsB = new CurrentConditionsB();
weatherData.registerObserver(currentConditionsA);
weatherData.registerObserver(currentConditionsB);
weatherData.setData(30,150,60);
weatherData.removeObserver(currentConditionsA);
weatherData.setData(90,350,70);
}
}
上述代码 GitHub 地址:https://github.com/baicun/designPatterns