内容简介:《Head First设计模式》笔记整理...欢迎交流...
《Head First设计模式》笔记整理...欢迎交流...
定义
定义对象之间的一对多的依赖,这样一来,当一个对象改变状态时,它的所有依赖者都会收到通知并自动更新。
OO原则
- 封装变化
- 多用组合,少用继承
- 针对接口编程,而不是针对实现编程
- 为了交互对象之间的松耦合而努力
一对多关系
定义类图
松耦合的威力
松耦合:当两个对象之间松耦合,他们依然可以交互,但是不太清楚彼此的细节。
观察者模式让主题和对象之间松耦合。
为什么呢?
关于观察者的一切,主题只知道观察者实现看某个接口(即Observer接口)。主题不需要知道观察值是谁,做了些什么或其他任何细节。
建立一个气象站
已知由气象站提供WeatherData对象,用来追踪目前的天气状况(温度、湿度、气压)。我们需要建立三个布告板(目前状况、气象统计、天气预报),分别显示目前的状况。并且要求此应用是可以扩展的。
public interface Subject {
public void registerObserver(Observer o); //传入一个观察者变量,用来注册观察者
public void registerObserver(Observer o); //传入一个观察者变量,用来删除观察者
public void notifyObserver(); //当主题状态改变时,通知观察者
}
public interface Observer { // 所有的观察者都必须实现update方法,以实现观察者接口
public void update(float temp, float humidity, float pressure); //当气象状态值改变时,主题会把这些状态值当做方法的参数,传递给观察者
}
public interface DisplayElement {
public void display(); // DisplayElement接口只包含一个方法,那就是display。当不高者需要显示时,调用此接口
}
在weatherData中实现主题接口
public class WeatherData implements Subject {
private ArrayList observers;
private float temoerature; // 温度
private float humidity; // 湿度
private float pressure; // 气压
public void registerObserver(Observer o) {
observers.add(o);
}
public void removeObserver(Observer o) {
int i = observers.indexof(o);
if(i >= 0) {
observers.remove(o);
}
}
public void notifyObserver(Observer o) {
for(int i = 0; i < observers.size(); i++) {
Observer observer = (Observer) observers.get(i);
observers.update(temoerature, humidity, pressure);
}
}
public void measurementsChanged() {
notifyObservers(); // 当从气象站得到耿勋观测值时,我们通知观察者
}
public void setMeasurements(float temoerature, float humidity, float pressure) { // 这是一个测试方法
this.temoerature = temoerature;
this.humidity = humidity;
this.pressure = pressure;
this.measurementsChanged();
}
//WeatherData的其它方法
}
下面建立布告板
public class CurrentConditionDisplay inplements Observer, DsiplayElement {
privete float temperature;
private float humidity;
private Subject weatherData;
public CurrentConditionDisplay(Subject weatherDate) { //构造器需要WeatherData对象
this.weatherDate = weatherDate;
weatherDate.registerOvserver(this);
}
public void update(temperature, humidity, weatherData) {
this.temperature = temperature;
this.humidity = humidity;
this.display();
}
public void display() {
System.out.print("Current conditions:" + this.temperature + "F degrees and " + this.humidity + "% humidity");
}
}
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
复盘+:把经验转化为能力(第2版)
邱昭良 / 机械工业出版社 / 39.00
随着环境日趋多变、不确定、复杂、模糊,无论是个人还是组织,都需要更快更有效地进行创新应变、提升能力。复盘作为一种从经验中学习的结构化方法,满足了快速学习的需求,也是有效进行知识萃取与共享的机制。在第1版基础上,《复盘+:把经验转化为能力》(第2版)做了六方面修订: ·提炼复盘的关键词,让大家更精准地理解复盘的精髓; ·基于实际操作经验,梳理、明确了复盘的"底层逻辑"; ·明确了复......一起来看看 《复盘+:把经验转化为能力(第2版)》 这本书的介绍吧!