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

广州市建设工程安全监督站网站一套小程序ui设计多少钱

广州市建设工程安全监督站网站,一套小程序ui设计多少钱,网站开发技术课程设计总结,三台网站seo求职华为#xff0c;被问观察者模式#xff0c;从没有这种体验#xff01;#xff01;#xff01;模式的定义与特点模式的结构与实现1. 模式的结构2. 模式的实现模式的应用实例模式的应用场景模式的扩展1. Observable类2. Observer 接口[ 观察者模式可以说是非常贴近我们… 求职华为被问观察者模式从没有这种体验模式的定义与特点模式的结构与实现1. 模式的结构2. 模式的实现模式的应用实例模式的应用场景模式的扩展1. Observable类2. Observer 接口[ 观察者模式可以说是非常贴近我们生活的一个设计模式为什么这么说呢哲学上有这么一种说法叫做“万事万物皆有联系”原意是说世上没有孤立存在的事物但其实也可以理解为任何一个事件的发生必然由某个前置事件引起也必然会导致另一个后置事件。 我们的生活中充斥着各种各样的相互联系的事件而观察者模式主要就是用于处理这种事件的一套解决方案。 模式的定义与特点 观察者Observer模式的定义指多个对象间存在一对多的依赖关系当一个对象的状态发生改变时所有依赖于它的对象都得到通知并被自动更新。这种模式有时又称作发布-订阅模式、模型-视图模式它是对象行为型模式。 观察者模式是一种对象行为型模式其主要优点如下。 降低了目标与观察者之间的耦合关系两者之间是抽象耦合关系。符合依赖倒置原则。 目标与观察者之间建立了一套触发机制。 它的主要缺点如下。 目标与观察者之间的依赖关系并没有完全解除而且有可能出现循环引用。 当观察者对象很多时通知的发布会花费很多时间影响程序的效率。 模式的结构与实现 实现观察者模式时要注意具体目标对象和具体观察者对象之间不能直接调用否则将使两者之间紧密耦合起来这违反了面向对象的设计原则。 1. 模式的结构 观察者模式的主要角色如下。 抽象主题Subject角色也叫抽象目标类它提供了一个用于保存观察者对象的聚集类和增加、删除观察者对象的方法以及通知所有观察者的抽象方法。 具体主题Concrete Subject角色也叫具体目标类它实现抽象目标中的通知方法当具体主题的内部状态发生改变时通知所有注册过的观察者对象。 抽象观察者Observer角色它是一个抽象类或接口它包含了一个更新自己的抽象方法当接到具体主题的更改通知时被调用。 具体观察者Concrete Observer角色实现抽象观察者中定义的抽象方法以便在得到目标的更改通知时更新自身的状态。 观察者模式的结构图如图 1 所示。 2. 模式的实现 观察者模式的实现代码如下 package net.biancheng.c.observer; import java.util.*; public class ObserverPattern {public static void main(String[] args) {Subject subject new ConcreteSubject();Observer obs1 new ConcreteObserver1();Observer obs2 new ConcreteObserver2();subject.add(obs1);subject.add(obs2);subject.notifyObserver();} } //抽象目标 abstract class Subject {protected ListObserver observers new ArrayListObserver();//增加观察者方法public void add(Observer observer) {observers.add(observer);}//删除观察者方法public void remove(Observer observer) {observers.remove(observer);}public abstract void notifyObserver(); //通知观察者方法 }//加入Java开发交流君样756584822一起吹水聊天 //具体目标 class ConcreteSubject extends Subject {public void notifyObserver() {System.out.println(具体目标发生改变...);System.out.println(--------------);for (Object obs : observers) {((Observer) obs).response();}} } //抽象观察者 interface Observer {void response(); //反应 } //具体观察者1 class ConcreteObserver1 implements Observer {public void response() {System.out.println(具体观察者1作出反应);} }//加入Java开发交流君样756584822一起吹水聊天 //具体观察者1 class ConcreteObserver2 implements Observer {public void response() {System.out.println(具体观察者2作出反应);} }模式的应用实例 【例1】利用观察者模式设计一个程序分析“人民币汇率”的升值或贬值对进口公司进口产品成本或出口公司的出口产品收入以及公司利润率的影响。 分析当“人民币汇率”升值时进口公司的进口产品成本降低且利润率提升出口公司的出口产品收入降低且利润率降低当“人民币汇率”贬值时进口公司的进口产品成本提升且利润率降低出口公司的出口产品收入提升且利润率提升。 这里的汇率Rate类是抽象目标类它包含了保存观察者Company的 List 和增加/删除观察者的方法以及有关汇率改变的抽象方法 change(int number)而人民币汇率RMBrate类是具体目标 它实现了父类的 change(int number) 方法即当人民币汇率发生改变时通过相关公司公司Company类是抽象观察者它定义了一个有关汇率反应的抽象方法 response(int number)进口公司ImportCompany类和出口公司ExportCompany类是具体观察者类它们实现了父类的 response(int number) 方法即当它们接收到汇率发生改变的通知时作为相应的反应。图 2 所示是其结构图。 [ 程序代码如下 package net.biancheng.c.observer; import java.util.*; public class RMBrateTest {public static void main(String[] args) {Rate rate new RMBrate();Company watcher1 new ImportCompany();Company watcher2 new ExportCompany();rate.add(watcher1);rate.add(watcher2);rate.change(10);rate.change(-9);}//加入Java开发交流君样756584822一起吹水聊天 } //抽象目标汇率 abstract class Rate {protected ListCompany companys new ArrayListCompany();//增加观察者方法public void add(Company company) {companys.add(company);}//删除观察者方法public void remove(Company company) {companys.remove(company);}public abstract void change(int number); } //具体目标人民币汇率 class RMBrate extends Rate {public void change(int number) {for (Company obs : companys) {((Company) obs).response(number);}}//加入Java开发交流君样756584822一起吹水聊天 } //抽象观察者公司 interface Company {void response(int number); } //具体观察者1进口公司 class ImportCompany implements Company {public void response(int number) {if (number 0) {System.out.println(人民币汇率升值 number 个基点降低了进口产品成本提升了进口公司利润率。);} else if (number 0) {System.out.println(人民币汇率贬值 (-number) 个基点提升了进口产品成本降低了进口公司利润率。);}} } //具体观察者2出口公司 class ExportCompany implements Company {public void response(int number) {if (number 0) {System.out.println(人民币汇率升值 number 个基点降低了出口产品收入降低了出口公司的销售利润率。);} else if (number 0) {System.out.println(人民币汇率贬值 (-number) 个基点提升了出口产品收入提升了出口公司的销售利润率。);}} }现在用“观察者模式”来实现该事件处理模型。 首先定义一个铃声事件RingEvent类它记录了铃声的类型上课铃声/下课铃声。 再定义一个学校的铃BellEventSource类它是事件源是观察者目标类该类里面包含了监听器容器 listener可以绑定监听者学生或老师并且有产生铃声事件和通知所有监听者的方法。 然后定义铃声事件监听者BellEventListener类它是抽象观察者它包含了铃声事件处理方法 heardBell(RingEvent e)。 最后定义老师类TeachEventListener和学生类StuEventListener它们是事件监听器是具体观察者听到铃声会去上课或下课。图 4 给出了学校铃声事件处理程序的结构。 程序代码如下 package net.biancheng.c.observer; import java.util.*; public class BellEventTest {public static void main(String[] args) {BellEventSource bell new BellEventSource(); //铃事件源bell.addPersonListener(new TeachEventListener()); //注册监听器老师bell.addPersonListener(new StuEventListener()); //注册监听器学生bell.ring(true); //打上课铃声System.out.println(------------);bell.ring(false); //打下课铃声}//加入Java开发交流君样756584822一起吹水聊天 } //铃声事件类用于封装事件源及一些与事件相关的参数 class RingEvent extends EventObject {private static final long serialVersionUID 1L;private boolean sound; //true表示上课铃声,false表示下课铃声public RingEvent(Object source, boolean sound) {super(source);this.sound sound;}public void setSound(boolean sound) {this.sound sound;}public boolean getSound() {return this.sound;} } //目标类事件源铃 class BellEventSource {private ListBellEventListener listener; //监听器容器public BellEventSource() {listener new ArrayListBellEventListener();}//给事件源绑定监听器public void addPersonListener(BellEventListener ren) {listener.add(ren);}//事件触发器敲钟当铃声sound的值发生变化时触发事件。public void ring(boolean sound) {String type sound ? 上课铃 : 下课铃;System.out.println(type 响);RingEvent event new RingEvent(this, sound);notifies(event); //通知注册在该事件源上的所有监听器}//加入Java开发交流君样756584822一起吹水聊天//当事件发生时,通知绑定在该事件源上的所有监听器做出反应调用事件处理方法protected void notifies(RingEvent e) {BellEventListener ren null;IteratorBellEventListener iterator listener.iterator();while (iterator.hasNext()) {ren iterator.next();ren.heardBell(e);}} } //抽象观察者类铃声事件监听器 interface BellEventListener extends EventListener {//事件处理方法听到铃声public void heardBell(RingEvent e); } //具体观察者类老师事件监听器 class TeachEventListener implements BellEventListener {public void heardBell(RingEvent e) {if (e.getSound()) {System.out.println(老师上课了...);} else {System.out.println(老师下课了...);}} }//加入Java开发交流君样756584822一起吹水聊天 //具体观察者类学生事件监听器 class StuEventListener implements BellEventListener {public void heardBell(RingEvent e) {if (e.getSound()) {System.out.println(同学们上课了...);} else {System.out.println(同学们下课了...);}} }模式的应用场景 在软件系统中当系统一方行为依赖另一方行为的变动时可使用观察者模式松耦合联动双方使得一方的变动可以通知到感兴趣的另一方对象从而让另一方对象对此做出响应。 通过前面的分析与应用实例可知观察者模式适合以下几种情形。 对象间存在一对多关系一个对象的状态发生改变会影响其他对象。当一个抽象模型有两个方面其中一个方面依赖于另一方面时可将这二者封装在独立的对象中以使它们可以各自独立地改变和复用。实现类似广播机制的功能不需要知道具体收听者只需分发广播系统中感兴趣的对象会自动接收该广播。多层级嵌套使用形成一种链式触发机制使得事件具备跨域跨越两种观察者类型通知。 模式的扩展 在 Java 中通过 java.util.Observable 类和 java.util.Observer 接口定义了观察者模式只要实现它们的子类就可以编写观察者模式实例。 1. Observable类 Observable 类是抽象目标类它有一个 Vector 向量用于保存所有要通知的观察者对象下面来介绍它最重要的 3 个方法。 void addObserver(Observer o) 方法用于将新的观察者对象添加到向量中。void notifyObservers(Object arg) 方法调用向量中的所有观察者对象的 update() 方法通知它们数据发生改变。通常越晚加入向量的观察者越先得到通知。void setChange() 方法用来设置一个 boolean 类型的内部标志位注明目标对象发生了变化。当它为真时notifyObservers() 才会通知观察者。 2. Observer 接口 Observer 接口是抽象观察者它监视目标对象的变化当目标对象发生变化时观察者得到通知并调用 void update(Observable o,Object arg) 方法进行相应的工作。 【例3】利用 Observable 类和 Observer 接口实现原油期货的观察者模式实例。 分析当原油价格上涨时空方伤心多方局兴当油价下跌时空方局兴多方伤心。本实例中的抽象目标Observable类在 Java 中已经定义可以直接定义其子类即原油期货OilFutures类它是具体目标类该类中定义一个SetPriCe(float price) 方法当原油数据发生变化时调用其父类的 notifyObservers(Object arg) 方法来通知所有观察者另外本实例中的抽象观察者接口Observer在 Java 中已经定义只要定义其子类即具体观察者类包括多方类 Bull 和空方类 Bear并实现update(Observable o,Object arg)方法即可。图 5 所示是其结构图。 [ package net.biancheng.c.observer; import java.util.Observer; import java.util.Observable; public class CrudeOilFutures {public static void main(String[] args) {OilFutures oil new OilFutures();Observer bull new Bull(); //多方Observer bear new Bear(); //空方oil.addObserver(bull);oil.addObserver(bear);oil.setPrice(10);oil.setPrice(-8);}//加入Java开发交流君样756584822一起吹水聊天 } //具体目标类原油期货 class OilFutures extends Observable {private float price;public float getPrice() {return this.price;}public void setPrice(float price) {super.setChanged(); //设置内部标志位注明数据发生变化super.notifyObservers(price); //通知观察者价格改变了this.price price;} } //具体观察者类多方 class Bull implements Observer {public void update(Observable o, Object arg) {Float price ((Float) arg).floatValue();if (price 0) {System.out.println(油价上涨 price 元多方高兴了);} else {System.out.println(油价下跌 (-price) 元多方伤心了);}} } //具体观察者类空方 class Bear implements Observer {public void update(Observable o, Object arg) {Float price ((Float) arg).floatValue();if (price 0) {System.out.println(油价上涨 price 元空方伤心了);} else {System.out.println(油价下跌 (-price) 元空方高兴了);}} }最后祝大家早日学有所成拿到满意offer
http://www.pierceye.com/news/548624/

相关文章:

  • 呢图网站场建设封面长安镇做网站
  • 搜索关键词的网站黄山做网站
  • 网络建站系统去除wordpress主题头部作者信息
  • 鼓楼微网站开发番禺有经验的网站建设
  • 对网站建设心得进入公众号继续阅读怎么弄
  • 网站建设公司投诉电话可以先做网站后备案吗
  • 顺的品牌网站设计价位网站开发合同书
  • 用html5制作个人网站深圳百度国际大厦
  • 网络网站公司网站管理平台扩展插件
  • 个人小说网站怎么做把自己做的网页变成网站
  • led网站制作网站登录后不显示内容
  • 推广网站公司兴义市住房和城乡建设局网站
  • 营销网站建设的公司哪家好创建网站超链接
  • 苏州网站优化排名推广企业网站建设价格
  • 在线制作论坛网站wordpress建立好的网站
  • 网站的功能规范商城网站静态模板下载
  • 双语言网站源码制作网页的软件哪个好
  • 政务网站建设需求网站首页页面代码
  • 网站产品详情页怎么做的用服务器做网站空间
  • 河北网站制作报价长春市建设技工学校网站
  • 盘锦做网站专家常州网站建设企业网站制作
  • 关于建设网站的报告wordpress 视频 广告插件
  • 生态养殖网站模板网赌网站建设多少钱
  • wordpress is长沙百度提升优化
  • 福州网站建设哪个好网页被禁止浏览怎么解决
  • 缩短链接的网站磁力猫引擎
  • 佛山网站到首页排名网站开发招标任务书
  • 网站建设相关专业手机网站建设软件有哪些
  • 做网站编辑累吗平台推广策划
  • 景区网站模板深圳中建南方建设集团网站