网站怎么做优化步骤,网站导出链接查询,creative wordpress,可以访问的国外网站最近在读《Head First设计模式》一书#xff0c;此系列会引用源书内容#xff0c;但文章内容会更加直接#xff0c;以及加入一些自己的理解。 观察者模式#xff08;有时又被称为模型-视图#xff08;View#xff09;模式、源-收听者(Listener)模式或从属者模式#xff… 最近在读《Head First设计模式》一书此系列会引用源书内容但文章内容会更加直接以及加入一些自己的理解。 观察者模式有时又被称为模型-视图View模式、源-收听者(Listener)模式或从属者模式。在此种模式中一个目标物件管理所有相依于它的观察者物件并且在它本身的状态改变时主动发出通知。这通常透过呼叫各观察者所提供的方法来实现。此种模式通常被用来实现事件处理系统。 引子 我们的公司刚刚你拿下了一个中国气象局的一个招标负责建立北京市的气象观测站。该气象站必须建立在中国气象局专利申请中的WeatherData对象上有WeatherData对象负责追踪目前的天气状况由于本文只做例子只追踪温度、湿度、气压。气象站提出应用的要求 1、我们公司能建立一个应用有三种布告板可以显示实时天气状况、气象统计、以及简单的预报。 2、当WeatherData对象获得最新的测量数据时三种布告板必须实时更新。 3、我们的气象站是可以扩展的气象站希望可以公布一组API接口好让其他开发人员可以自己写出自己的气象公告板并插入此应用 初步设计 1、首先根据气象站的需求我们画一个示意图。 WeatherData对象知道如何跟物理气象站联系当数据跟新时WeatherData对象从气象站获得数据WeatherData对象随机更新三个布告板的显示目前状况温度、湿度、气压、气象统计和天气预报所以我们目前的主要任务是利用WeatherData对象从气象站获取数据并跟新三个布告板。 在设计之前我们要看一看气象站给我们WeatherData类此处只做示意代码后面会变得完整 public class WeatherData {//下面的三个方法获取温度、湿度、以及压力public float getTemperature(){temperature获取温度;return temperature;}public float getHumidity(){temperature获取湿度;return humidity;}public float getPressure(){temperature获取压力;return pressure;}//一旦气象测量更新、此方法就会被调用public void measurementsChanged(){} 好了到此为止我们已经知道了最终的设计要求以及气象站给我们的WeatherData类下面我们就要开始设计我们的应用根据我们知道的东西我们可以先来一个不完整的初版我们现在WeatherData中增加一些方法不着急先写出方法的具体内容只要写出一个方法名记得它的功能即可 public class WeatherData { //下面的三个方法获取温度、湿度、以及压力public float getTemperature(){temperature获取温度;return temperature;}public float getHumidity(){temperature获取湿度;return humidity;}public float getPressure(){temperature获取压力;return pressure;}//一旦气象测量更新、此方法就会被调用public void measurementsChanged(){float temp getTemperature();float humidity getHumidity();float pressure getPressure(); currentConditionsDisplay.update(temp,humidity,pressure); statisticsDiaplay.updata(temp,humidity,pressure); forecastDisplay.update(temp,humidity,pressure);} 这是我们第一次设计的程序由于我们已经开始准备用设计模式了所以我们可以看看我们目前的代码中是不是有还可以改进的地方首先我们看到了三个公告板都有update方法那我们就可以把这个方法 抽取成一个接口这样我们每次增加公告板时直接实现此接口就可以其次本次我们讨论的是观察者模式那我们的引子就先说到这我们开始看看什么是观察者设计模式我们了解完观察者设计模式后我们 再回到我们的引子完成设计。 认识观察者设计模式 在生活中订阅报纸就是就是一个观察者设计模式报社的业务就是出版报纸当你订阅了某家报社的报纸只要报社有了新的报纸出版他们就会给你送来只要你是他们的订户你就一定会收到报 纸当你不想在看这家报纸时你就可以取消订阅他们就不会再送来新报纸。其实出版社订阅者就等于观察者模式只是在这个模式里出版社叫做“主题(Subject)”,订阅者叫做观察者(Observer)”,如果 你还没有看懂那我们来看下面这个图 图中主题对象管理者int数据狗对象、猫对象、老鼠对象订阅了主题一旦主题对象发生改变就会给这些订阅了的对象发送数据鸭子对象没有订阅主题就不会接收到数据。 有一天鸭子对象突然对主题对象管理的数据起了兴趣它就需要过去告诉主题我对你的数据改变有兴趣一有变化请告诉我这就是“订阅”的过程在这之后鸭子对象就是正式 的观察者了以后主题管理的数据再有改变就会告诉鸭子对象。 又有一天老鼠对象对主题说你管理的数据我观察太久了我不想再当你的观察者了这时主题就删掉老鼠对象每当数据再变化时老鼠对象就不会接收到数据。 观察者设计模式定义了对象之间的一对多依赖这样的依赖当一个对象改变时它的所有依赖者都会受到通知并自动更新 下面是便是定义观察者设计模式的类图 将观察者设计模式应用到我们的气象站中 我们已经基本了解了观察者设计模式那我们就可以回到我们的引子完成原来的设计 初步思考 通过我们在上面分析的观察者设计模式我们发现这是模式是一对多的关系每当一改变时就会给多发送改变的数据而在我们的气象站设计中正是一对多的关系一就是我们的WeatherData数据 多就是显示的布告板而不同的布告板有相同和不同的方法我们可以把相同的部分抽取成接口实现代码的复用那么下面就让我们参照上面观察者设计模式的类图画一下我们气象站的设计类图。自己 先尝试一下哟 设计气象站 实现气象站 根据上面的类图我们就可以完善我们的代码啦 Subject类的接口及WeatherData实现 package com.frank.observe.subject;
import com.frank.observe.observer.Observer;public interface Subject { //主题注册、删除、通知观察者方法public void registerObserver(Observer o);public void removeObserver(Observer o);public void notifyObserver();//信息改变时执行方法public void measurementsChanged();
} package com.frank.observe.subject;
import java.util.ArrayList;
import com.frank.observe.observer.Observer;public class WeatherData implements Subject { //WeatherData实现了Subject方法private ArrayListObserver observers; //包含温度、湿度、压力private float temperature;private float humidity;private float pressure;//构造器创建观察者们的集合public WeatherData(){observers new ArrayListObserver();}//接口方法Overridepublic void registerObserver(Observer o) {observers.add(o);}Overridepublic void removeObserver(Observer o) {int i observers.indexOf(o);if(i0){observers.remove(o);}}Overridepublic void notifyObserver() {for(int i 0;iobservers.size();i){Observer observer observers.get(i);observer.update(temperature, humidity, pressure);}}Overridepublic void measurementsChanged() {notifyObserver();}//WeatherData自己的set方法一会测试时在test中改变数据源public void setMeasurements(float temperature,float humidity, float pressure){this.temperaturetemperature;this.humidityhumidity;this.pressurepressure;measurementsChanged();}} Observer类的接口以及CurrentConditionDisplay实现 package com.frank.observe.observer;
//Observer接口中更新数据的方法
public interface Observer {public void update(float temp,float humidity,float pressure);
} package com.frank.observe.observer;
import com.frank.observe.display.DisplayElement;
import com.frank.observe.subject.Subject;
import com.frank.observe.subject.WeatherData;
//显示板要实现Observer以及DisplayElement接口及公共方法
public class CurrentConditionDisplay implements Observer, DisplayElement {private float temprature;private float humidity; //将weatherData作为自己的成员变量private Subject weatherData;//在带参构造器中将自己注册到weatherData中public CurrentConditionDisplay(Subject weatherData){this.weatherDataweatherData;weatherData.registerObserver(this);}//接口的更新方法Overridepublic void update(float temp, float humidity, float pressure) {this.tempraturetemp;this.humidityhumidity; //接口的显示方法display();}Overridepublic void display() {System.out.println(current conditions tempratureF degrees andhumidity% humidity);}} DisplayElement接口 package com.frank.observe.display;public interface DisplayElement {public void display();
} Test方法 package com.frank.observe.test;
import com.frank.observe.observer.CurrentConditionDisplay;
import com.frank.observe.subject.WeatherData;public class Test {public static void main(String[] args) { //新建一个主题WeatherData weatherData new WeatherData(); //新建一个公告板并将自己注册到主题中CurrentConditionDisplay currentDisplay new CurrentConditionDisplay(weatherData); //每当主题更新数据时发送给观察者观察者显示在公告板中weatherData.setMeasurements(80, 60, 30.4f);weatherData.setMeasurements(82, 70, 29.2f);weatherData.setMeasurements(78, 90, 29.2f);}} 结果 current conditions80.0F degrees and60.0% humidity
current conditions82.0F degrees and70.0% humidity
current conditions78.0F degrees and90.0% humidity 总结 要点 OO基础抽象 OO原则封装变化、多用组合少用继承、针对接口编程不针对实现编程 OO模式观察者设计模式----在对象之间定义一对多的依赖这样一来当一个对象改变状态依赖它的对象都会受到通知并自动更新(后面的系列会看到其代表人物--MVC) 转载于:https://www.cnblogs.com/FrancisLiu/p/8728070.html