当前位置: 首页 > news >正文

响应式营销网站北京建筑公司招聘信息

响应式营销网站,北京建筑公司招聘信息,网站备案进度查询,网站权重批量查询背景 客户有一个WeatherData对象#xff0c;负责追踪温度、湿度和气压等数据。现在客户给我们提了个需求#xff0c;让我们利用WeatherData对象取得数据#xff0c;并更新三个布告板#xff1a;目前状况、气象统计和天气预报。 WeatherData对象提供了4个接口#xff1a; …背景 客户有一个WeatherData对象负责追踪温度、湿度和气压等数据。现在客户给我们提了个需求让我们利用WeatherData对象取得数据并更新三个布告板目前状况、气象统计和天气预报。 WeatherData对象提供了4个接口 getTemperature()获取温度 getHumidity()获取湿度 getPressure()获取气压 measurementsChanged()一旦气象测量更新此方法会被调用 我们的工作是实现measurementsChanged()好让它更新目前状况、气象统计、天气预报的显示布告板。 我们的工作就是建立一个应用利用WeatherData对象取得数据并更新三个布告板目前状况、气象统计和天气预报。 先看一个错误示范 public class WeatherData{//实例变量声明public void measurementsChanged(){//获取温度、湿度、气压数据float tempgetTemperature();float humiditygetHumidity();float pressuregetPressure(); //调用update()更新布告板currentConditionsDisplay.update(temp,humidity,pressure);statisticsDisplay.update(temp,humidity,pressure);forecastDisplay.update(temp,humidity,pressure); }//其他WeatherData方法 }回顾第一章中的概念与原则 currentConditionsDisplay.update(temp,humidity,pressure); statisticsDisplay.update(temp,humidity,pressure); forecastDisplay.update(temp,humidity,pressure);针对具体实现编程会导致以后增删布告版时必须修改程序 对变化的部分必须封装起来。 认识观察者模式 先看看报纸和杂志的订阅是怎么回事 报社的业务就是出版报纸 向某家报社订阅报纸只要他们有新报纸出版就会给你送来。只要你是他们的订户你就会一直收到新报纸 当你不想再看报纸的时候取消订阅他们就不会再送新报来 只要报社还在运营就会有人向他们订阅报纸或取消订阅报纸。 观察者模式与订阅报纸类似出版者改称为“主题”Subject订阅者改称为“观察者”Observer。主题对象管理某些数据。当主题内的数据改变就会通知观察者。已经订阅了主题的观察者会在主题数据发送改变时收到通知。如果观察者不想接收新的数据可以取消订阅之后主题数据改变时就不会收到通知。 定义观察者模式 观察者模式定义了对象之间的一对多依赖这样一来当一个对象改变时他的所有依赖者都会收到通知并自动更新。 类图 主题与观察者之间松耦合 当两个对象之间松耦合它们依然可以交互但是不太清楚彼此的细节。 观察者模式提供了一种对象设计让主题和观察者之间松耦合。 关于观察者的一切主题只知道观察者实现了某个接口也就是Observer接口。主题不需要知道观察者的具体类是谁、做了些什么或其他任何细节。 任何时候我们都可以增加新的观察者。因为主题唯一依赖的东西是一个实现Observer接口的对象列表所以我们可以随时增加观察者。事实上在运行时我们可以用新的观察者取代现有的观察者主题不会受到任何影响。同样的也可以在任何时候删除某些观察者。 有新类型的观察者出现时主题的代码不需要修改。我们可以独立地复用主题或观察者。如果我们在其他地方需要使用主题或观察者可以轻易地复用。因为二者并非紧耦合。 改变主题或观察者其中一方并不会影响另一方。因为两者是松耦合的所以只要他们之间的接口仍被遵守我们就可以自由地改变他们。 松耦合的设计之所以能让我们建立有弹性的OO系统能够应对变化是因为对象之间的互相依赖降到了最低。 设计气象站 思考我们把WeatherData对象当作主题把布告板当作观察者布告板为了取得信息就必须先向WeatherData对象注册。 我们必须记得每个布告板都有差异这也就是为什么我们需要一个共同的接口的原因。尽管布告板的类都不一样但是它们都应该实现相同的接口好让WeathcrData对象能够知道如何把观测值送给它们。所以每个布告板都应该有一个大概名为update的方法以供WeatherData对象调用而这个update方法应该在所有布告板都实现的共同接口里定义。 类图 实现一 java为观察者模式提供了内置支持。但是我们暂时不用它而是先自己动手。虽然某些时候可以利用Java内置的支持但是有许多时候自己建立这一切会更具弹性况且建立这一切并不是很麻烦。 所以让我们从建立接口开始吧 Subject接口 public interface Subject {//这两个方法都需要一个观察者作为变量该观察者是用来注册或者被删除的public void registerObserver(Observer o);public void removeObserver(Observer o);//主题状态改变时此方法被调用以通知所有的观察者public void notifyObservers(); }Observer接口 public interface Observer {//当气象观测值改变时主题会把这些状态值当作方法参数传递给观察者//所有方法都必须实现update()方法以实现观察者接口public void update(float temp ,float humidity,float pressure); }DisplayElement接口 public interface DisplayElement {//当布告板需要显示时调用此方法public void display(); }在WeatherData中实现主题接口 public class WeatherData implements Subject {//ArrayList用于记录观察者private ArrayList observers;private float temperature;private float humidity;private float pressure;public WeatherData() {// 在构造方法中建立ArrayList observersnew ArrayList();}Overridepublic void registerObserver(Observer o) {// 当注册注册观察者时将它加到ArrayList后面即可observers.add(o);}Overridepublic void removeObserver(Observer o) {// 当观察者取消订阅时则将它从Arraylist中删除int iobservers.indexOf(o);if(i0)observers.remove(o);}Overridepublic void notifyObservers() {// 将状态告诉每一个观察者因为每个观察者都实现了update()方法for(int i0;iobservers.size;i){Observer observer(Observer)observers.get(i);observer.update(temperature, humidity, pressure);}}//当数据更新时通知观察者public void measurementsChanged() {notifyObservers();}public void setMeasurements(float temperature,float humidity,float presure) {//测试用方法this.temperaturetemperature;this.humidityhumidity;this.pressurepresure;measurementsChanged();} }布告板建立 此处只展示“目前状况”布告板另外两个与此类似。 public class CurrentConditionsDisplay implements Observer, DisplayElement {private float temperature;private float humidity;private Subject weatherData;public CurrentConditionsDisplay(Subject weatherData) {this.weatherDataweatherData;weatherData.registerObserver(this);}Overridepublic void display() {//显示当前温湿度状况System. out. println(Current conditions: temperatureF degrees andt humidity % humidity);}Overridepublic void update(float temperature, float humidity, float pressure) {this.temperaturetemperature;this.humidityhumidity;display();} }测试类 public static void main(String[] args) {// TODO 自动生成的方法存根WeatherData weatherDatanew WeatherData();CurrentConditionsDisplay currentiDisplaynew CurrentConditionsDisplay(weatherData);weatherData.setMeasurements(80, 65, 30.4f);weatherData.setMeasurements(82, 75, 29.2f);weatherData.setMeasurements(78, 90, 29.2f);}输出 这种观察者模式总是在数据改变时自动推送全部数据而观察者没有主动获取数据的方法因此有时会让观察者很困扰总是收到一大堆数据而观察者想要的只是其中一个或两个而已。但让观察者自己去取得数据就必须开放权限这样又带来数据安全性问题或者使用getter方法又会让需要很多数据的观察者多次调用才能全部取得想要的数据。 主动推送与观察者自行获取都有各自的优缺点因此Java内置的Observer模式两种方法都支持 java.util包package内包含最基本的Observer接口与Observable类这和我们的Subject接口与0bserver接口很相似。 Observer接口与0bscrvable类使用上更方便因为许多功能都已经事先准备好了。你甚至可以使用推push或拉pull的方式传送数据。 使用Java内置观察者模式类图 类图大体和原来差不多主题接口变为了Observerable类WeatherData也不再提供addObserver()等方法而是继承自Observerable. 如何把对象变成观察者… 如同以前一样实现观察者接口java.uitl.Observer然后调用任何Observable对象的addObserver方法。不想再当观察者时调用deleteObserver方法就可以了。 可观察者要如何送出通知…… 首先你需要利用扩展java.util.Observable接口产生“可观察者”类然后需个步骤 ①先调用setChanged方法标记状态已经改变的事实。 ②然后调用两种notifyObservers0方法中的一个 notifyobservers或 notifyobserversobject arg 观察者如何接收通知…… 同以前一样观察者实现了更新的方法但是方法的签名不太一样 如果你想“推”push数据给观察者你可以把数据当作数据对象传送给notifyObserversarg方法。否则观察者就必须从可观察者对象中“拉”pull数据。 其中 setChanged()方法是用来标记状态是否改变的好让notifyObservers知道当它被调用时应该更新观察者。如果调用notifyObservers之前没有先调用setChanged观察者就“不会”被通知。让我们看看Observable内部以了解这一切 这样做有其必要性。setChanged方法可以让你在更新观察者时有更多的弹性你可以更适当地通知观察者。 利用内置的支持重做气象站 首先把WeatherData改成使用java.util.Observable import java.util.Observable;//导入Observerable import java.util.Observer; public class WeatherData extends Observable {private float temperature;private float humidity;private float pressure;public WeatherData(){}//不再需要为了记住观察者们而建立数据结构了public void measurementsChanged(){setChanged();notifyObservers();//我们没有调用 notifyObsevets()传送数据对象这表示我们采用的做法是“拉” }public void setMeasurements(float temperature,float humidity,float pressure){this.temperaturetemperature;this.humidityhumidity;this.pressurepressure;measurementsChanged();}public float getTemperature(){return temperature;}public float getHumidity(){return humidity;}public float getPressure(){return pressure;} }重做CurrentConditionsDisplayimport java.util.Observable;//导入Observerable import java.util.Observer; //实现java.util.Observer接口 public class CurrentConditionsDisplay implements Observer, DisplayElement {Observerable observable;private float temperature;private float humidity;public CurrentConditionsDisplay(Observable observable) {// 将Observer当参数并将CurrentConditionsDisplay对象登记为观察者this.observableobservable;observable.addObserver(this);}Overridepublic void display() {//显示当前温湿度状况System. out. println(Current conditions: temperatureF degrees andt humidity % humidity);}Overridepublic void update(Observable obs, Object arg) {// TODO 自动生成的方法存根if(obs instanceof WeatherData){WeatherData weatherData(WeatherData)obs;this.temperatureweatherData.getTemperature();this.humidityweatherData.getHumidity();display();}} }输出 嗯你注意到差别了吗再看一次…… 你会看到相同的计算结果但是奇怪的地方在于文字输出的次序不一样。怎么会这样呢 思考一下… 不要依赖于观察者被通知的次序 java.uitl.Observable实现了它的notifyObservers方法这导致了通知观察者的次序不同于我们先前的次序。谁也没有错只是双方选择不同的方式实现罢了。但是可以确定的是如果我们的代码依赖这样的次序就是错的。为什么呢因为一旦观察者/可观察者的实现有所改变通知次序就会改变很可能就会产生错误的结果。这绝对不是我们所认为的松耦合。 java.util.Observable的弊端 如同你所发现的可观察者是一个“类”而不是一个“接口”更糟的是它甚没有实现一个接口。不幸的是java.util.Observable的实现有许多问题限制了它的使用和复用。这并不是说它没有提供有用的功能只是想提醒大家注意一些事实。 Observable是一个类到底会造成什么问题 首先因为Observable是一个“类”你必须设计一个类继承它。如果某类想同时具有Observable类和另一个超类的行为就会陷入两难毕竟Java不支持多重继承。 这限制了Observable的复用潜力而增加复用潜力不正是我们使用模式最原始的动机吗。 再者因为没有Observable接口所以你无法建立自己的实现和Java内置的Observer API搭配使用也无法将java.util的实现换成另一套做法的实现比方说Observable将关键的方法保护起来如果你看看ObservableAP1你会发现setChanged方法被保护起来了被定义成protected。那又怎么样呢这意味着除非你继承自Observable否则你无法创建Observable实例并组合到你自己的对象中来。这个设计违反了第二个设计原则“多用组合少用继承”。 如果你能够扩展java.util.Observable那么Observable“可能”可以符合你的需求。否则你可能需要像本章开头的做法那样自己实现这一整套观察者模式。 在JDK中并非只有在java.util中才能找到观察者模式共实在JavaBeans和Swing中也都实现了观察者模式。 结束 具体实现的代码我觉得还是看这本书来的清晰在本章节末尾还说到推模式和拉模式所谓推模式就是主题对象传递数据 拉模式就是观察者对象主动得数据我们要牢记一些设计原则 封装变化多用组合少用继承为交互对象之间的松耦合设计而努力
http://www.dnsts.com.cn/news/210617.html

相关文章:

  • 网站开发报价表格wordpress图片缩略图不显示
  • 汉邦未来网站开发企业网站开发期末报告
  • 做游戏的网站有哪些装饰装修网站大全
  • 创意做网站公司百度搜索资源平台提交
  • 营销型网站建设要多少钱关键词在线听免费
  • 微信上打开连接的网站怎么做网站建设具体运算
  • 网站开发语言优缺点从事网站开发需要哪些知识
  • 做企业展示网站需要多少钱网站建设的基本情况
  • 绍兴建设开发有限公司网站中国最大的外包公司有哪些
  • 做网站背景的图兰州seo快速优化报价
  • 网站seo优化外包顾问网站解析怎么设置
  • 网站注册免费永久专业购物网站建设价格
  • 企业网站建设标准wix做中文网站怎么样
  • 宁波新亚建设公司网站晋江网站建设
  • 建网站 免费网站建设怎么学习
  • 呼和浩特网站推广公司上海小程序开发制作
  • 做网站编辑怎么样网站推广的方式与技巧
  • 交通建设门户网站wordpress整合ecms同步登录
  • 集团网站建设价格网站广告推广平台
  • 微信小程序商店怎么开seo是哪个国家
  • 广东省建设厅官方网站电话山西省住房城乡建设厅网站
  • 精品网站建设费用 v磐石网络分销系统小程序
  • 如何自己建设电影网站中国公共招聘网
  • 天圆地方建筑网站猪八戒网站建设报价
  • 沈阳奇搜建站网络营销技巧和营销方法
  • 鲜花网站建设项目策 划书重庆展示型网站制作
  • 如何针对你的网站做搜索优化抖音代运营平台
  • 北京建设信源资讯网站官网wordpress仪表盘改名
  • 网站免费建站系统万基城市建设有限公司网站
  • ftp查看网站后台密码免费制作网站用什么做