福海网站制作嘉定个人网站建设

diannao/2025/10/21 18:56:51/文章来源:
福海网站制作,嘉定个人网站建设,wordpress注册登录界面,百度站长收录入口观察者模式#xff1a; 书中通过小菜描述同事在公司看股票行情#xff0c;并请求前台帮忙在老板回来时提醒同事#xff0c;引出需求。将前台通知同事老板回来的事写成程序。未用模式实现#xff1a; 1 //前台类2 public class Secretary {3 private ListStockObser…观察者模式 书中通过小菜描述同事在公司看股票行情并请求前台帮忙在老板回来时提醒同事引出需求。将前台通知同事老板回来的事写成程序。 未用模式实现 1 //前台类2 public class Secretary {3 private ListStockObserver observers new ArrayListStockObserver();4 private String action;5 //添加同事6 public void attach(StockObserver observer){7 observers.add(observer);8 }9 //待老板来时前台通过电话通知所有同事 10 public void notifyObserver(){ 11 for (StockObserver o : observers) { 12 o.update(); 13 } 14 } 15 public String getAction() { 16 return action; 17 } 18 public void setAction(String action) { 19 this.action action; 20 } 21 22 }   //同事类 1 public class StockObserver {2 //姓名3 private String name;4 //前台5 private Secretary secretary;6 public StockObserver(String name, Secretary secretary) {7 super();8 this.name name;9 this.secretary secretary; 10 } 11 public void update() { 12 System.out.println(secretary.getAction() 13 ,name关闭股票行情继续工作); 14 } 15 }   主方法 1 public class Main {2 public static void main(String[] args) {3 //前台小姐通知者4 Secretary tongzhizhe new Secretary();5 //两位公司同事6 StockObserver tongshi1 new StockObserver(魏关姹, tongzhizhe);7 StockObserver tongshi2 new StockObserver(易管查, tongzhizhe);8 //前台几下两位同事9 tongzhizhe.attach(tongshi1); 10 tongzhizhe.attach(tongshi2); 11 //老板来了.前台通知同事 12 tongzhizhe.setAction(老板来了); 13 tongzhizhe.notifyObserver(); 14 } 15 }     代码虽然将需求的基本功能实现了但是同事类需要前台小姐的状态前台小姐需要增加同事。这是典型的双向偶尔。这段代码及违反了开放封闭原则又违反了依赖倒转原则。 解耦实现 同事抽象类 //同事抽象类 public abstract class Observer { private String name; public abstract void update(); }同事实现类 //同事类 public class StockObserver extends Observer{ //姓名 private String name; private Subject subject; public StockObserver(String name,Subject subject) { super(); this.name name; this.subject subject; } Override public void update() { System.out.println(subject.getAction(),name关闭股票行情继续工作); } }//同事类 public class StockObserver2 extends Observer{ //姓名 private String name; private Subject subject; public StockObserver2(String name,Subject subject) { super(); this.name name; this.subject subject; } Override public void update() { System.out.println(subject.getAction(),name关闭NBA直播继续工作); } }通知者抽象类 //通知者抽象类 public abstract class Subject { String action; private ListObserver observers new ArrayListObserver(); //添加同事 public abstract void attach(Observer observer); //待老板来时前台通过电话通知所有同事 public abstract void notifyObserver(); public String getAction() { return action; } public void setAction(String action) { this.action action; } }通知者实现类 //前台类 public class Secretary extends Subject{ private ListObserver observers new ArrayListObserver(); private String action; //添加同事 public void attach(StockObserver observer){ observers.add(observer); } //待老板来时前台通过电话通知所有同事 public void notifyObserver(){ for (Observer o : observers) { o.update(); } } Override public void attach(Observer observer) { observers.add(observer); } public String getAction() { return action; } public void setAction(String action) { this.action action; } } 主程序 public class Main { public static void main(String[] args) { //前台小姐通知者 Secretary tongzhizhe new Secretary(); //两位公司同事 Observer tongshi1 new StockObserver(魏关姹,tongzhizhe); Observer tongshi2 new StockObserver2(易管查,tongzhizhe); //前台几下两位同事 tongzhizhe.attach(tongshi1); tongzhizhe.attach(tongshi2); //老板来了.前台通知同事 tongzhizhe.setAction(老板来了); tongzhizhe.notifyObserver(); } } 观察者模式定义 观察者模式又叫做发布-订阅Publish-Subscribe模式它定义了一种一对多的依赖关系让多个观察者对象同时监听某一个主题对象。这个主题对象在发生状态变化时会通知所有观察者对象使他们能够自动更新自己。 观察者模式UML类图 观察者模式特点 适用场景 1) 当一个抽象模型有两个方面, 其中一个方面依赖于另一方面。将这二者封装在独立的对象中以使它们可以各自独立地改变和复用。 2) 当对一个对象的改变需要同时改变其它对象, 而不知道具体有多少对象有待改变。 3) 当一个对象必须通知其它对象而它又不能假定其它对象是谁。换言之, 你不希望这些对象是紧密耦合的。 -------------------------------------------分割线----------------------------------------------------------- 后面内容摘自博客http://www.cnblogs.com/java-my-life/archive/2012/05/16/2502279.html 推模型和拉模型   在观察者模式中又分为推模型和拉模型两种方式。   ●  推模型      主题对象向观察者推送主题的详细信息不管观察者是否需要推送的信息通常是主题对象的全部或部分数据。   ●  拉模型      主题对象在通知观察者的时候只传递少量信息。如果观察者需要更具体的信息由观察者主动到主题对象中获取 相当于是观察者从主题对象中拉数据。一般这种模型的实现中会把主题对象自身通过update()方法传递给观察者这样在观察者需要获取数据的时候 就可以通过这个引用来获取了。   根据上面的描述发现前面的例子就是典型的推模型下面给出一个拉模型的实例。   拉模型的抽象观察者类   拉模型通常都是把主题对象当做参数传递。 public interface Observer {/*** 更新接口* param subject 传入主题对象方面获取相应的主题对象的状态*/public void update(Subject subject); }   拉模型的具体观察者类 public class ConcreteObserver implements Observer {//观察者的状态private String observerState;Overridepublic void update(Subject subject) {/*** 更新观察者的状态使其与目标的状态保持一致*/observerState ((ConcreteSubject)subject).getState();System.out.println(观察者状态为observerState);}}   拉模型的抽象主题类   拉模型的抽象主题类主要的改变是nodifyObservers()方法。在循环通知观察者的时候也就是循环调用观察者的update()方法的时候 传入的参数不同了。 public abstract class Subject {/*** 用来保存注册的观察者对象*/private ListObserver list new ArrayListObserver();/*** 注册观察者对象* param observer 观察者对象*/public void attach(Observer observer){list.add(observer);System.out.println(Attached an observer);}/*** 删除观察者对象* param observer 观察者对象*/public void detach(Observer observer){list.remove(observer);}/*** 通知所有注册的观察者对象*/public void nodifyObservers(){for(Observer observer : list){observer.update(this);}} }   拉模型的具体主题类   跟推模型相比有一点变化就是调用通知观察者的方法的时候不需要传入参数了。 public class ConcreteSubject extends Subject{private String state;public String getState() {return state;}public void change(String newState){state newState;System.out.println(主题状态为 state);//状态发生改变通知各个观察者this.nodifyObservers();} }   两种模式的比较   ■  推模型是假定主题对象知道观察者需要的数据而拉模型是主题对象不知道观察者具体需要什么数据没有办法的情况下干脆把自身传递 给观察者让观察者自己去按需要取值。   ■  推模型可能会使得观察者对象难以复用因为观察者的update()方法是按需要定义的参数可能无法兼顾没有考虑到的使用情况。这就意味 着出现新情况的时候就可能提供新的update()方法或者是干脆重新实现观察者而拉模型就不会造成这样的情况因为拉模型下update()方法的 参数是主题对象本身这基本上是主题对象能传递的最大数据集合了基本上可以适应各种情况的需要。 JAVA提供的对观察者模式的支持   在JAVA语言的java.util库里面提供了一个Observable类以及一个Observer接口构成JAVA语言对观察者模式的支持。   Observer接口   这个接口只定义了一个方法即update()方法当被观察者对象的状态发生变化时被观察者对象的notifyObservers()方法就会调用这一方法。 public interface Observer {void update(Observable o, Object arg); }   Observable类   被观察者类都是java.util.Observable类的子类。java.util.Observable提供公开的方法支持观察者对象这些方法中有两个对Observable的子类非常 重要一个是setChanged()另一个是notifyObservers()。第一方法setChanged()被调用之后会设置一个内部标记变量代表被观察者对象的状态发生 了变化。第二个是notifyObservers()这个方法被调用时会调用所有登记过的观察者对象的update()方法使这些观察者对象可以更新自己。 public class Observable {private boolean changed false;private Vector obs;/** Construct an Observable with zero Observers. */public Observable() {obs new Vector();}/*** 将一个观察者添加到观察者聚集上面*/public synchronized void addObserver(Observer o) {if (o null)throw new NullPointerException();if (!obs.contains(o)) {obs.addElement(o);}}/*** 将一个观察者从观察者聚集上删除*/public synchronized void deleteObserver(Observer o) {obs.removeElement(o);}public void notifyObservers() {notifyObservers(null);}/*** 如果本对象有变化那时hasChanged 方法会返回true* 调用本方法通知所有登记的观察者即调用它们的update()方法* 传入this和arg作为参数*/public void notifyObservers(Object arg) {Object[] arrLocal;synchronized (this) {if (!changed)return;arrLocal obs.toArray();clearChanged();}for (int i arrLocal.length-1; i0; i--)((Observer)arrLocal[i]).update(this, arg);}/*** 将观察者聚集清空*/public synchronized void deleteObservers() {obs.removeAllElements();}/*** 将“已变化”设置为true*/protected synchronized void setChanged() {changed true;}/*** 将“已变化”重置为false*/protected synchronized void clearChanged() {changed false;}/*** 检测本对象是否已变化*/public synchronized boolean hasChanged() {return changed;}/*** Returns the number of observers of this ttObservable/tt object.** return the number of observers of this object.*/public synchronized int countObservers() {return obs.size();} }   这个类代表一个被观察者对象有时称之为主题对象。一个被观察者对象可以有数个观察者对象每个观察者对象都是实现Observer接口的对象。 在被观察者发生变化时会调用Observable的notifyObservers()方法此方法调用所有的具体观察者的update()方法从而使所有的观察者都被通知更 新自己。 怎样使用JAVA对观察者模式的支持   这里给出一个非常简单的例子说明怎样使用JAVA所提供的对观察者模式的支持。在这个例子中被观察对象叫做Watched而观察者对象叫做 Watcher。Watched对象继承自java.util.Observable类而Watcher对象实现了java.util.Observer接口。另外有一个Test类扮演客户端角色。   源代码   被观察者Watched类源代码 public class Watched extends Observable{private String data ;public String getData() {return data;}public void setData(String data) {if(!this.data.equals(data)){this.data data;setChanged();}notifyObservers();} }     观察者类源代码 public class Watcher implements Observer{public Watcher(Observable o){o.addObserver(this);}Overridepublic void update(Observable o, Object arg) {System.out.println(状态发生改变 ((Watched)o).getData());}}   测试类源代码 public class Test {public static void main(String[] args) {//创建被观察者对象Watched watched new Watched();//创建观察者对象并将被观察者对象登记Observer watcher new Watcher(watched);//给被观察者状态赋值watched.setData(start);watched.setData(run);watched.setData(stop);}}   Test对象首先创建了Watched和Watcher对象。在创建Watcher对象时将Watched对象作为参数传入然后Test对象调用Watched对象的 setData()方法触发Watched对象的内部状态变化Watched对象进而通知实现登记过的Watcher对象也就是调用它的update()方法。 转载于:https://www.cnblogs.com/xsyfl/p/6842511.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/92027.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

网页模板免费下载网站蚌埠高端网站建设

System.Data虽然不引人关注,但在.NET中,System.Data对于各种关系数据库的连接是非常重要的。System.Data也被称为ADO.NET,其前身是ActiveX Data Objects。System.Data提供了通过的框架,在她的基础上.NET数据驱动应用可以被构建。这…

网站弹屏广告怎么做潍坊高级网站建设推广

假设工程根目录为 d:/Project/ 然后在 d:/Project/a/b/c/d/file.py 里使用 os.getcwd() 方法获取的是 d:/Project/a/b/c/d 现在我想获取 d:/Project 怎么做? ------------------------------------分割线--------------------------------- 谢谢大家的热情回答,都怪我没有将问…

网站开发需要有登陆界面的网站微信群二维码大全网站

2019.12.31 天气:晴 地点:杭州 今天是2019年的最后一天,就用这篇博客来记录一下这一年的历程吧。 时间很快,它从指缝中悄悄划过的时候,我们好似毫无感觉,突然又一年就过去了,大学四年的生活也随…

广西网站建设推荐哪些网站国内打不开

datePicker日期控件是很常用的控件,可以使用 start , depth来控制取值的范围。 start ,depth可以选择的参数有month,year,decade ,century 。 如何要只选择年:我们要用参数 decade ,…

外贸营销型网站建设平台网站做视频流量赚钱吗

1 你为什么不喜欢拍照片(素材来源网络,侵删)▼2 当登记处挂起横幅▼3 这几天老是犯的错误▼4 在图书馆收获的爱情(素材来源网络,侵删)▼5 当老师用键盘讲课(素材来源网络,侵删&a…

网站首页轮播图片浙江理工大学网站设计与建设

1. 如果要判断数组中是否存在某个元素的话很好判断,直接用数组的indexOf方法就好,存在返回当前索引不存在返回-1 var arr[1,2,3,4] arr.indexOf(3) // 2 arr.indexOf(5) // -1 2. 要只是判断的话是可以遍历后判断对象的属性是否相同的,像这种…

公司建网站多少钱一年关于二手书的网站开发ppt

结构Hive 是建立在hadoop上的数据仓库架构,它提供了一系列的工具,可以进行数据提取转换加载(这个过程叫做ETL),这是一种可以存储,查询和分析存储在hadoop中的大规模数据的机制.Hive定义了简单的类SQL查询语句 成为hql,他允许数据SQL的用户查询数据.同时 这个语言也允许数据mapr…

网站推广哪个好温州seo网站推广

​最近一直在做AI大模型上车的战略企划工作,听了好多供应商的宣讲,自己也查阅了大量书籍、资料。信息输入呈现爆炸性增长,受限于专业知识水平,仅能在应用层面上有所思考。纯个人观点,仅供参考。 车自古以来都是移动工…

网站投注员怎么做苏州建设交通

一、定义和结构 作用:捕获同步执行代码下的异常错误 在没有使用try...catch的情况下,同步代码执行遇到异常会报错,并中断后续代码执行; 在使用try...catch的情况下,同步代码执行遇到异常会抛出异常,并继续…

做网站全体教程小程序代理与加盟

int[] a new int[10];int[] a new int[]{元素1,元素2};int[] a {元素1,元素2};

建设银行网站修改密码哪些网站可以做商家

近期,受邀担任两个国际学术会议的Special session共同主席及程序委员会成员(TPC member),欢迎广大学界同行踊跃投稿,分享最新研究成果。期待这个夏天能够在夏威夷檀香山或者加利福尼亚圣荷西与各位学者深入交流。 SERA…

网站搬家后出错免费网站可以做cpa

一 Process对象的join方法 在主进程运行过程中,如果想并发地执行其它的任务,我们可以开启子进程,此时主进程的任务与子进程的任务分两种情况: 情况一:在主进程的任务与子进程的任务彼此独立的情况下,主进程…

网站开发技术发展历程wordpress导入网站

假设我们有一个称为nums和另一个数字k的不同数字的列表,我们必须找到总计为k的不同组合的数量。您可以在创建组合时重复使用数字。因此,如果输入像nums [2,4,5] k 4,那么输出将是2,因为我们可以将两个这样…

做网站赚钱交税昆明网站建设知名企业

从Eumetsat批量下载哨兵数据等各种数据 那些最好的程序员不是为了得到更高的薪水或者得到公众的仰慕而编程,他们只是觉得这是一件有趣的事情! 批量下载Sentinel数据脚本2023 从Eumetsat批量下载哨兵数据等各种数据🌿前言🍀脚本构成…

深圳建设网站首页网络广告的缺点

CASS9.1中,计算土方量的方法有:DTM法土方计算、断面法进行土方量计算、方格网法土方计算、等高线法土方计算、区域土方量平衡等。本文以案例的形式,详细讲解土方量的计算过程。 文章目录 一、DTM法土方计算二、断面法进行土方量计算三、方格网法土方计算四、等高线法土方计算…

网站窗口代码wordpress怎么去掉主题上的自豪

今天我们来聊一聊Linux零拷贝技术,今天我们以一个比较有代表性的技术sendfile系统调用为切入点,详细介绍一下零拷贝技术的原理。 1.零拷贝技术简介 Linux零拷贝技术是一种优化数据传输的技术,它可以减少数据在内核态和用户态之间的拷贝次数&…

中国少数民族网站建设linux wordpress教程

1 什么是 JVM 内存模型 JVM 需要使用计算机的内存,Java 程序运行中所处理的对象或者算法都会使用 JVM 的内 存空间,JVM 将内存区划分为 5 块,这样的结构称之为 JVM 内存模型。 2 JVM 为什么进行内存区域划分 随着对象数量的增加&#xff…

永远网站建设怎样自己做qq网站

在编写ts项目的时候,经常会出现如下报错: 导入声明中的所有导入都未使用 这是因为导入的模块暂时没有使用,ts给的一个提示信息 解决方案: 在ts.config.json中 把noUnusedLocals 设置为false即可 {"compilerOptions"…

网站设计方案谁写胶州城乡建设局网站

I2C控制器 文章目录 I2C控制器1、I2C模块介绍2、I2C驱动API介绍3、I2C使用实例3.1 主模式3.1.1 主设备发送模式和主设备接收模式3.1.2 DMA方式发送3.2 从模式内部集成电路总线(I2C)广泛用在微控制器和传感器及其他片外模块的通讯上,它本身支持多主多从模式,仅仅使用两根线(…

网站根目录文件夹商城网站怎么做

C的虚函数是一种特殊的成员函数,用于实现多态性。虚函数允许在基类中声明一个函数,在派生类中根据需要进行重写,并通过基类指针或引用来调用派生类对象的特定实现。 ①虚函数的声明 ②多态性 ③派生类重写虚函数 ④纯虚函数 ⑤注意 ①虚…