内容简介:《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"); } }
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
猜你喜欢:本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Designing Data-Intensive Applications
Martin Kleppmann / O'Reilly Media / 2017-4-2 / USD 44.99
Data is at the center of many challenges in system design today. Difficult issues need to be figured out, such as scalability, consistency, reliability, efficiency, and maintainability. In addition, w......一起来看看 《Designing Data-Intensive Applications》 这本书的介绍吧!