JAVA语言之观察者模式
小职 2018-06-21 来源 : 阅读 776 评论 0

摘要:在JAVA语言观察者模式中,一个被观察者管理所有相依于它的观察者物件,并且在本身的状态改变时主动发出通知。这通常通过呼叫各观察者所提供的方法来实现。此种模式通常被用来实现事件处理系统。希望对大家学习JAVA语言有所帮助。

在JAVA语言观察者模式中,一个被观察者管理所有相依于它的观察者物件,并且在本身的状态改变时主动发出通知。这通常通过呼叫各观察者所提供的方法来实现。此种模式通常被用来实现事件处理系统。希望对大家学习JAVA语言有所帮助。

 

角色

抽象被观察者角色:把所有对观察者对象的引用保存在一个集合中,每个被观察者角色都可以有任意数量的观察者。被观察者提供一个接口,可以增加和删除观察者角色。一般用一个抽象类和接口来实现。

抽象观察者角色:为所有具体的观察者定义一个接口,在得到主题的通知时更新自己。

具体被观察者角色:在被观察者内部状态改变时,给所有登记过的观察者发出通知。具体被观察者角色通常用一个子类实现。

具体观察者角色:该角色实现抽象观察者角色所要求的更新接口,以便使本身的状态与主题的状态相协调。通常用一个子类实现。如果需要,具体观察者角色可以保存一个指向具体主题角色的引用。

 

适用场景

1) 当一个抽象模型有两个方面, 其中一个方面依赖于另一方面。将这二者封装在独立的对象中以使它们可以各自独立地改变和复用。

2) 当对一个对象的改变需要同时改变其它对象, 而不知道具体有多少对象有待改变。

3) 当一个对象必须通知其它对象,而它又不能假定其它对象是谁。换言之, 你不希望这些对象是紧密耦合的。

 

应用

珠宝商运送一批钻石,有黄金强盗准备抢劫,珠宝商雇佣了私人保镖,警察局也派人护送,于是当运输车上路的时候,强盗保镖警察都要观察运输车一举一动,

抽象的观察者

[java] view plain copy
1. public interface Watcher  
2. {  
3.      public void update();  
4. }

抽象的被观察者,在其中声明方法(添加、移除观察者,通知观察者):

[java] view plain copy
1. public interface Watched  
2. {  
3.      public void addWatcher(Watcher watcher);  
4.   
5.      public void removeWatcher(Watcher watcher);  
6.   
7.      public void notifyWatchers();  
8. }

具体的观察者

保镖

[java] view plain copy
1. public class Security implements Watcher  
2. {  
3.      @Override  
4.      public void update()  
5.      {  
6.           System.out.println(“运输车有行动,保安贴身保护");  
7.      }  
8. }

  

强盗

[java] view plain copy
1. public class Thief implements Watcher  
2. {  
3.      @Override  
4.      public void update()  
5.      {  
6.           System.out.println(“运输车有行动,强盗准备动手");  
7.      }  
8. }

警察

[java] view plain copy
1. public class Police implements Watcher  
2. {  
3.      @Override  
4.      public void update()  
5.      {  
6.           System.out.println(“运输车有行动,警察护航");  
7.      }  
8. }

具体的被观察者

[java] view plain copy
1. public class Transporter implements Watched  
2. {  
3.      private List<Watcher> list = new ArrayList<Watcher>();  
4.   
5.      @Override  
6.      public void addWatcher(Watcher watcher)  
7.      {  
8.           list.add(watcher);  
9.      }  
10.   
11.      @Override  
12.      public void removeWatcher(Watcher watcher)  
13.      {  
14.           list.remove(watcher);  
15.      }  
16.   
17.      @Override  
18.      public void notifyWatchers(String str)  
19.      {  
20.           for (Watcher watcher : list)  
21.           {  
22.                watcher.update();  
23.           }  
24.      }  
25.   
26. }

测试类

[java] view plain copy
1. public class Test  
2. {  
3.      public static void main(String[] args)  
4.      {  
5.           Transporter transporter = new Transporter();  
6.   
7.           Police police = new Police();  
8.           Security security = new Security();  
9.           Thief thief = new Thief();  
10.   
11.           transporter.addWatcher(police);  
12.           transporter.addWatcher(security);  
13.           transporter.addWatcher(security);  
14.   
15.           transporter.notifyWatchers();  
16.      }  
17. }

 

我推你拉

例子中没有关于数据和状态的变化通知,只是简单通知到各个观察者,告诉他们被观察者有行动。

观察者模式在关于目标角色、观察者角色通信的具体实现中,有两个版本。

一种情况便是目标角色在发生变化后,仅仅告诉观察者角色“我变化了”,观察者角色如果想要知道具体的变化细节,则就要自己从目标角色的接口中得到。这种模式被很形象的称为:拉模式——就是说变化的信息是观察者角色主动从目标角色中“拉”出来的。

还有一种方法,那就是我目标角色“服务一条龙”,通知你发生变化的同时,通过一个参数将变化的细节传递到观察者角色中去。这就是“推模式”——管你要不要,先给你啦。

这两种模式的使用,取决于系统设计时的需要。如果目标角色比较复杂,并且观察者角色进行更新时必须得到一些具体变化的信息,则“推模式”比较合适。如果目标角色比较简单,则“拉模式”就很合适啦。

本文由职坐标整理并发布,希望对同学们有所帮助。了解更多详情请关注编程语言JAVA频道!

本文由 @小职 发布于职坐标。未经许可,禁止转载。
喜欢 | 2 不喜欢 | 0
看完这篇文章有何感觉?已经有2人表态,100%的人喜欢 快给朋友分享吧~
评论(0)
后参与评论

您输入的评论内容中包含违禁敏感词

我知道了

助您圆梦职场 匹配合适岗位
验证码手机号,获得海同独家IT培训资料
选择就业方向:
人工智能物联网
大数据开发/分析
人工智能Python
Java全栈开发
WEB前端+H5

请输入正确的手机号码

请输入正确的验证码

获取验证码

您今天的短信下发次数太多了,明天再试试吧!

提交

我们会在第一时间安排职业规划师联系您!

您也可以联系我们的职业规划师咨询:

小职老师的微信号:z_zhizuobiao
小职老师的微信号:z_zhizuobiao

版权所有 职坐标-一站式IT培训就业服务领导者 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
 沪公网安备 31011502005948号    

©2015 www.zhizuobiao.com All Rights Reserved

208小时内训课程