3 行为型模式之 - 观察者模式

观察者模式介绍: 

观察者模式是一个使用率非常高的模式,这最深用的地方是GUI系统,订阅--发布系统。因为这个模式一个重要作用就是解耦,将被观察者和观察者解耦,使得他们之间的依赖性更小。

定义:定义对象间一种一对多的关系,使得每当一个对象改变状态,则所有依赖它的对象都会得到通知并被自动更新

使用场景:

1 关联行为场景。需要注意的是,关联行为是可拆分的,而不是“组合”的关系

2 事件多级触发场景

3 跨系统的消息交换场景,如消息队列,事件总线的处理机制

下面我们以生活中的交通灯:以行人过马路说起为例,其中车和行人是观察者,红灯是被观察者,以人的视角为例

观察者:车和行人

被观察者:红灯

红灯亮了(车对面的绿灯也亮了),车行,行人停

代码如下:

1 /**
2  * 观察者
3  */
4 public abstract class Observer {
5     protected abstract void onChange();
6 }

1 /**
2  * 观察者:车
3  */
4 public class Car extends Observer{
5     @Override
6     protected void onChange() {
7         System.out.println("绿灯亮了,我可以走了");
8     }
9 }

1 /**
2  * 观察者:行人
3  */
4 public class People extends Observer{
5     @Override
6     protected void onChange() {
7         System.out.println("红灯亮了,我要等一等");
8     }
9 }

下面是被观察者:灯

 1 /**
 2  * 被观察者:灯
 3  */
 4 public class Observable {
 5     //观察者集合
 6     private ArrayList<Observer> observers = new ArrayList<>();
 7
 8     //注册一个观察者
 9     public void registerObserver(Observer observer){
10         observers.add(observer);
11     }
12
13     //反注册一个观察者
14     public void unregisterObserver(Observer observer){
15         observers.remove(observer);
16     }
17
18     public void dataChanged(){
19         for (Observer observer : observers){
20             observer.onChange();
21         }
22     }
23
24 }

下面是测试类

 1 /**
 2  * 测试观察者模式
 3  */
 4 public class ObserverTest {
 5
 6     public static void main(String[] args){
 7
 8         //创建两个观察者
 9         Observer car = new Car();
10         Observer people = new People();
11
12         //创建一个被观察者
13         Observable observable = new Observable();
14
15         //注册两个观察者
16         observable.registerObserver(car);
17         observable.registerObserver(people);
18
19         //被观察者发出某一个事件
20         observable.dataChanged();
21
22     }
23
24
25 }

被观察者保存一个观察者的列表,被观察者状态一变,就遍历观察者列表并调用观察都onChange函数,但是也有一个弊端,如果观察者过多的话,导致被观察者中的列表太大,会有性能上的问题。所以要视情况而定再使用,当然也可以结合线程池等来优化。

注:设计模式交流学习群 632945466  欢迎所有热爱技术的大牛,小菜,一起学习讨论进步提高,欢迎随时批评指正

posted on 2017-04-17 22:36 九路313 阅读(...) 评论(...) 编辑 收藏

转载于:https://www.cnblogs.com/start1225/p/6725295.html

3 行为型模式之 - 观察者模式相关推荐

  1. 行为型模式:观察者模式

    前方高能:<一故事一设计模式>PDF 电子书已经上线,关注公众号即可获取. 行为型模式:观察者模式 十一大行为型模式之七:观察者模式. 简介 姓名 :观察者模式 英文名 :Observer ...

  2. 行为型模式之观察者模式

    学习设计模式,让你提升百倍 专栏 重点文章 设计模式 设计模式基础前奏(上) 设计模式 设计模式基础前奏(下) 设计模式 创建者模式之单例模式 设计模式 创建者模式之工厂模式 设计模式 创建者模式之原 ...

  3. 设计模式-行为型模式-Observer 观察者模式

    设计模式-行为型模式-Observer 观察者模式 1.简介 软件程序之间的解耦,减少相互之间的依赖关系,但是模块之间又是需要协同工作的: 观察者模式使得一个对象的状态发生改变的时候,已经预约的其他对 ...

  4. 面向对象程序设计(OOP设计模式)-行为型模式之观察者模式的应用与实现

    课程名称:程序设计方法学 实验5:OOP设计模式-行为型模式的应用与实现 时间:2015年12月02日三,第3.4节地点:理 一.实验目的 加深对行为型设计模式的理解以及在开发中的实际应用能力. 二. ...

  5. Java设计模式——行为型模式之观察者模式

    一.前言 在生活中我们会遇到这样的场景:用水壶烧开水.当水烧开时,你会有一个关火的过程.在烧水的过程中,你一直观察着这个烧水的进度,当它的状态改变时会触发你关火的这个动作.观察者模式就是处理这种场景而 ...

  6. C++行为型模式-实现观察者模式

    一.观察者模式基本概念 1.1 观察者模式的动机 建立一个对象与对象之间的依赖关系,一个对象发生改变时,将自动通知其他对象,其他对象将相应做出反应.在此,发生改变的对象称为观察目标,被通知的对象称为观 ...

  7. 行为型模式-06观察者模式

    文章目录 六.观察者模式 1. `定义` 2. `结构` 3. `案例` 4. `代码` 5. `优缺点` 6. `使用场景` 六.观察者模式 1. 定义 又被称为发布-订阅模式,它定义了一种一对多的 ...

  8. 设计模式 -行为型模式_ 观察者模式Observer Pattern 之 JDK内置的实现

    文章目录 概念 Code [主题] [观察者s] 观察者一 观察者二 [测试] 源码分析 java.util.Observable 目标类 java.util.Observer 观察者接口 notif ...

  9. 设计模式----行为型模式之观察者模式(Observer Pattern)

    下面是阅读<Head First设计模式>的笔记. 观察者模式 定义了对象之间的一对多依赖,这样一来,当一个对象改变状态时,它的所有依赖者都会收到通知并自动更新. JDK API内置机制 ...

  10. 设计模式——行为型模式_观察者模式/发布-订阅模式

    1. 类图 2. 角色 Subject:被观察者,抽象类 ConcreteSubject:被观察者的具体类,每个具体类中有列表记录任意数量的观察者 Observer:观察者接口 ConcrereObs ...

最新文章

  1. linux命令telnet
  2. 重构之SqlHelper
  3. How to use Chrome HAR save HTTP performance
  4. 陌上花开 HYSBZ - 3262 (CDQ分治)
  5. esp32 怎么分配freertos 堆栈大小_深度解剖~ FreeRtos阅读笔记2 任务创建、内核链表初始化...
  6. matlab表达式部分项求和,matlab如何得到符号表达式中某一部分项的系数
  7. 将一个数组拼接成一个指定字符串返回
  8. bzoj1041 [HAOI2008]圆上的整点 gcd
  9. 印花材料使用过程中的三个常见问题及解决方案
  10. Asp.Net中的正则表达式问题可以在此提问,今后大家一起研究!贴出基本语法参考...
  11. ORB-SLAM:一种通用的(全能的)精确的单目SLAM系统(ORB-SLAM论文翻译)
  12. win11官网的预览版系统如何下载安装
  13. 如何解读springboot 中约定大于配置、JPA是什么、咋用
  14. ES集群状态检查报错:master_not_discovered_exception 503错误
  15. 查找计算机缓存文件,Win7系统怎么查找IE浏览器缓存文件夹路径
  16. word中“项目符号”和后面的文字间隔太远
  17. 2个 windows 下的网络测试工具
  18. oVirt管理端高可用模式搭建(hosted-engine)
  19. 如何进行app性能测试,app性能测试应关注的测试点
  20. Linux下编译安装python

热门文章

  1. KVO 的使用和举例
  2. android 资源文件
  3. 《数据结构与抽象:Java语言描述(原书第4版)》一2.2 使用可变大小的数组实现ADT包...
  4. 【C#】eventlog类的使用
  5. Crontab 实例
  6. element-ui的tree配合原生
  7. vgextend 扩容卷组,即把物理卷加入卷组
  8. Springboot中使用JWT
  9. 河北省考计算机知识点,河北省计算机一级考试上机操作题考点总结与分析
  10. python递归函数基例_函数和代码复用 --Python