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

什么是电子商务网站建设的基本要求中关村手机之家报价

什么是电子商务网站建设的基本要求,中关村手机之家报价,有哪个网站可以学做面条开面馆,动漫技术制作专业文章目录 一、前言二、观察者模式1、基本概念2、应用举例3、结构3.1、Observer和ConcreteObserver3.2、Subject和ConcreteSubject 4、代码展示4.1、主题接口 WeatherData 和观察者接口 Observer4.2、具体主题 WeatherStation#xff0c;它实现了 WeatherData 接口#xff1a;… 文章目录 一、前言二、观察者模式1、基本概念2、应用举例3、结构3.1、Observer和ConcreteObserver3.2、Subject和ConcreteSubject 4、代码展示4.1、主题接口 WeatherData 和观察者接口 Observer4.2、具体主题 WeatherStation它实现了 WeatherData 接口4.3、具体观察者类4.4、主程序中使用这些组件来模拟天气App的运行 三、总结 一、前言 观察者Observer模式的定义指多个对象间存在一对多的依赖关系当一个对象的状态发生改变时所有依赖于它的对象都得到通知并被自动更新。这种模式有时又称作发布-订阅模式、模型-视图模式它是对象行为型模式。 二、观察者模式 1、基本概念 观察者Observer模式中包含两种对象分别是目标对象和观察者对象。在目标对象和观察者对象间存在着一种一对多的对应关系当这个目标对象的状态发生变化时所有依赖于它的观察者对象都会得到通知并执行它们各自特有的行为。 通俗地说就好像这些观察者对象在时刻注视着目标对象被观察。无论何时该目标对象的状态发生变化这些观察者对象都能够马上知道并根据目标对象的新状态执行相应的任务。 观察者模式又叫发布-订阅Publish-Subscribe模式其中的订阅表示这些观察者对象需要向目标对象进行注册这样目标对象才知道有哪些对象在观察它。发布指的是当目标对象的状态改变时它就向它所有的观察者对象发布状态更改的消息以让这些观察者对象知晓。 一个目标对象的观察者对象数量是不固定的可以随时增加新的观察者对象或取消已有的观察者对象。观察者模式的主要优点就是极大地降低了目标对象和观察者对象间的耦合二者可以独自地改变和复用让对系统增加功能或删除功能都很方便。 2、应用举例 我们举一个实际的例子来说明对观察者模式的运用假设我们有一个天气App它有很多个界面组件这些组件的作用分别是显示摄氏温度、显示华氏温度、显示气温感受比如炎热、凉爽和寒冷等等。当然该App应该还有另一个对象用于获取实时的天气数据我们称它为天气对象。 这个天气对象和界面组件之间的依赖关系就可以用观察者模式实现该天气对象就是目标对象天气数据就是它的状态。这些界面组件就是观察者对象当天气对象获取到新的天气数据时此时它的状态改变了它就通知所有依赖于它的界面组件这些组件就更新它们显示的内容。 现在我们想扩展这个天气App的功能让它可以向用户建议如何穿衣。因此我们需要一个新的界面组件当温度高时显示穿薄点当温度低时显示穿羽绒服。我们让这个新的界面组件注册成为天气对象目标对象的观察者这样当天气数据改变时它就会自动得到通知并显示新的穿衣建议。而天气对象和其余的界面组件都不会受到影响也无需改变。 现在让我们再次修改这个天气App这次是要删除显示华氏温度的功能。因为我们中国人更习惯摄氏温度显示华氏温度不但多此一举还可能让用户误将它当作摄氏温度。此时我们只需向天气对象目标对象取消注册该界面组件再删除它就可以了天气对象在数据更新时就不会再通知该界面组件了。同样的该App的其余部分也不会受到本次修改的影响。 3、结构 Subject目标类它是一个抽象类也是所有目标对象的父类。它用一个列表记录当前目标对象有哪些观察者对象并提供增加、删除观察者对象和通知观察者对象的接口。 Observer观察者类它也是一个抽象类是所有观察者对象的父类它为所有的观察者对象都定义了一个名为update的方法也叫成员函数。当目标对象的状态改变时它就是通过调用它的所有观察者对象的update方法来通知它们的。 ConcreteSubject具体目标类可以有多个不同的具体目标类它们同时继承Subject类。一个目标对象就是某个具体目标类的对象一个具体目标类负责定义它自身的事务逻辑并在状态改变时通知它的所有观察者对象。 ConcreteObserver具体观察者类可以有多个不同的具体观察者类它们同时继承Observer类。一个观察者对象就是某个具体观察者类的对象。每个具体观察者类都要重定义Observer类中定义的update方法在该方法中实现它自己的任务逻辑当它被通知的时候目标对象调用它的update方法就执行自己特有的任务。 3.1、Observer和ConcreteObserver 首先目标对象需要知道有哪些观察者对象在观察它这样它才知道状态改变时应该通知哪些观察者对象并且它还要能随时添加和删除观察者对象。所以目标对象应该要有一个列表来保存对它的所有观察者对象的引用。但在C或Java这样的编程语言中一个列表中的所有项都必须是同一类型的。这说明所有的观察者对象都必须是同一个类但这样会限制程序的灵活性。因为不同的观察者对象要执行不同的任务我们应该让它们属于不同的类。解决这一矛盾的途径是让所有的观察者类都有一个共同的父类Observer这些观察者类ConcreteObserver都是该父类的不同子类。因为所有子类的对象都可以被当作父类的对象因此它们即可以保持不同又可以保存在同一列表中。 同时这也解决了另一个问题那就是目标对象是如何通知它的观察者对象的呢当然这是通过调用它的观察者对象的一个方法也叫成员函数来实现的。目标对象只需要负责通知它的观察者对象它的状态改变了而对该观察者对象如何处理新状态以及属于哪个具体观察者类都不需要了解。这就是说目标对象只能以同一种方式对待它的所有观察者对象即这些观察者对象都要有一个相同的方法供目标对象调用我们称该方法为update方法。 我们在抽象观察者类Observer中定义该方法并在所有具体观察者类ConcreteObserver中重定义它。当目标对象的状态改变时它在它的列表中每遍历到一个观察者对象就调用该观察者对象的update方法。对目标对象来说所有的观察者对象都是Observer类的并且该类确实有一个update方法所以能调用成功。又因为多态实际执行的却是该观察者对象所属的具体观察者类中重定义的那个update方法。 要在观察者类中建立这样的继承关系的另一大原因是为了能方便地扩展功能。因为目标对象将所有的观察者对象都当作Observer类的对象来处理所以要增加某种新的观察者对象时我们只需创建一个新的类让它继承Observer类并重定义update方法在该update方法中实现它自己的任务逻辑就行了。这样所有由该新类创建的观察者对象都可以很容易地融入到当前的观察者模式中程序的其余部分都不需要改变。 3.2、Subject和ConcreteSubject 那么为什么目标类目标对象所属的类也需要有一个抽象目标类Subject和多个具体目标类ConcreteSubject这样的继承结构呢如果整个系统中只有一个目标对象那么确实可以只用一个目标类实现观察者模式。我们之前说的都是多个观察者对象观察一个目标对象但其实一个观察者对象也可以同时观察多个目标对象。 既然要同时观察多个目标对象那么它们很可能有不同的状态以及不同的功能即这些目标对象可能属于不同的类。也就是说一个观察者对象要被多个不同类的目标对象通知到注意目标对象通知观察者对象是通过调用观察者对象的一个方法实现的。我们先考虑一个笨办法在观察者类中为每一个目标类都提供一个版本的update方法。这样不仅麻烦而且代码难以维护想象一下我们要增加一个新的目标类那么就需要在所有要观察它的观察者类中都增加一个对应版本的update方法当我们想删掉一个目标类的时候又要在这些观察者类中删除那个对应版本的update方法。 一个通用的解决方式是让所有的目标类都调用同一个update方法但是将自身的引用作为该方法的一个参数传递给观察者对象这样观察者对象就知道是哪一个目标对象在通知它。一个方法或成员函数的参数的类型是确定的也就是说所有的目标类都应该是同一个类。 这就又出现了观察者类中开始的矛盾局面即所有的目标类既要是同一个类也要是不同的类。解决的方式也是一样的即所有的目标类都有同一个父类抽象目标类Subject而不同的目标类具体目标类ConcreteSubject都是该父类的不同子类。 无论一个观察者对象可以同时观察多个目标对象还是只能观察一个目标对象目标类的这种继承关系都有助于增加新的目标类即扩展程序的功能。当我们想增加新的具体目标类时就创建一个新类再让它继承Subject类并实现它自己特有的事务逻辑就可以了。这样由该新类所创建的目标对象就可以很轻松地融入到当前的观察者模式中程序的其余部分都不会受到影响。 抽象目标类Subject和具体目标类ConcreteSubject以及抽象观察者类Observer和具体观察者类ConcreteObserver之间的继承关系降低了目标对象它属于某个具体目标类和观察者对象它属于某个具体观察者类之间的耦合度。 4、代码展示 4.1、主题接口 WeatherData 和观察者接口 Observer import java.util.List;public interface WeatherData {void registerObserver(Observer observer);void removeObserver(Observer observer);void notifyObservers();void setMeasurements(float temperature, float humidity, float pressure); }public interface Observer {void update(float temperature, float humidity, float pressure); }4.2、具体主题 WeatherStation它实现了 WeatherData 接口 import java.util.ArrayList; import java.util.List;public class WeatherStation implements WeatherData {private ListObserver observers;private float temperature;private float humidity;private float pressure;public WeatherStation() {observers new ArrayList();}Overridepublic void registerObserver(Observer observer) {observers.add(observer);}Overridepublic void removeObserver(Observer observer) {observers.remove(observer);}Overridepublic void notifyObservers() {for (Observer observer : observers) {observer.update(temperature, humidity, pressure);}}Overridepublic void setMeasurements(float temperature, float humidity, float pressure) {this.temperature temperature;this.humidity humidity;this.pressure pressure;measurementsChanged();}private void measurementsChanged() {notifyObservers();} }4.3、具体观察者类 public class CelsiusDisplay implements Observer {Overridepublic void update(float temperature, float humidity, float pressure) {float celsius (temperature - 32) * 5 / 9;System.out.println(摄氏温度 celsius ℃);} }public class FahrenheitDisplay implements Observer {Overridepublic void update(float temperature, float humidity, float pressure) {System.out.println(华氏温度 temperature ℉);} }public class WeatherConditionDisplay implements Observer {Overridepublic void update(float temperature, float humidity, float pressure) {String condition ;if (temperature 30) {condition 炎热;} else if (temperature 10) {condition 凉爽;} else {condition 寒冷;}System.out.println(气温感受 condition);} }4.4、主程序中使用这些组件来模拟天气App的运行 public class WeatherApp {public static void main(String[] args) {WeatherStation weatherStation new WeatherStation();CelsiusDisplay celsiusDisplay new CelsiusDisplay();FahrenheitDisplay fahrenheitDisplay new FahrenheitDisplay();WeatherConditionDisplay conditionDisplay new WeatherConditionDisplay();// 注册观察者weatherStation.registerObserver(celsiusDisplay);weatherStation.registerObserver(fahrenheitDisplay);weatherStation.registerObserver(conditionDisplay);// 模拟天气数据变化weatherStation.setMeasurements(86.0f, 70.0f, 101.3f);weatherStation.setMeasurements(50.0f, 65.0f, 100.0f);weatherStation.setMeasurements(5.0f, 45.0f, 99.5f);} }当运行 WeatherApp 后你将看到不同的观察者显示了相应的温度和气温感受这是因为它们订阅了主题 WeatherStation 并在主题状态变化时得到通知并更新自己的显示。 这个示例演示了如何使用观察者模式实现一个天气App其中多个界面组件订阅了天气数据的变化。这种模式使得各个组件之间解耦易于扩展和维护同时保持了代码的可重用性。 三、总结 在某些平台上可以向目标对象同时注册一个观察者对象和它的某个方法成员函数。这样当目标对象的状态改变时它就调用这个观察者对象的这个注册的方法而不一定要去调用它的update方法。这就允许这些观察者对象没有update方法即它们不用都继承自同一个父类。当然一个目标对象可能要求它的所有观察者注册的回调方法都具有相同的函数原型即这些方法要有相同数量和类型的参数以及相同类型的返回值。 观察者模式还有很多其它的实现方式但这些方式都只是在一些细节上有所不同。只要理解了观察者模式的主要概念就能够很容易理解这些细节差异。
http://www.zqtcl.cn/news/27118/

相关文章:

  • 网站规划分析的好处电脑如何免费安装wordpress
  • 购物网站建设所需软件南通建筑人才网
  • 企业网站如何设计网页代做土木毕业设计网站
  • 网站ip过万建设部特种作业证网站查询
  • 织梦多语言网站企业网站建设费现金流科目
  • 合肥企业网站建设工个人网页设计作品欣赏图片
  • 绍兴网站建设制作物流公司官方网站
  • 网站死链接是什么网页设计如何设计导航栏
  • 浙江建设信息港网站考试成绩查询dedecms网站空白
  • 网站开发 题目自己开发微网站
  • 网站项目需求表wordpress统计插件下载
  • 手机网站cms有哪些网站怎么搬家
  • div做网站郑州网络推广厂家
  • 让人做网站 需要准备什么国内外画画做的好网站
  • 效果图素材网站百度竞价登陆
  • 设计公司官网网页桂林seo优化
  • 重庆丰都建设局网站网站开发实训要求
  • 外贸自主建站平台做业务查牙医诊所一般用什么网站
  • 怎么攻击php做的网站六安市城乡建设网站
  • 阜阳网站网站建设seo信息网
  • 网站插件代码大全葫芦岛市城乡建设局网站
  • 自己用自己电脑做网站空间植物网站设计方案
  • 增加网站备案wordpress小工具失效
  • 做基本的网站wordpress按钮
  • 企业网站优化推广怎么做ue5培训机构哪家强
  • 上海医疗网站备案表彩妆做推广的网站
  • 网站项目下载我国的网络营销公司
  • 源码如何做网站网站开发开发
  • 购物网站开发 需求分析wordpress图片存储
  • 学平面设计网站wordpress 定时 检查