1.什么是观察者模式?

定义:在对象之间定义了一对多的依赖,这样一来,当一个对象改变状态,依赖它的对象会收到通知并自动更新.

举个栗子: 张三和李四准备上演一场抢劫银行的行动,张三负责抢劫,李四负责放哨,他们两约定,如果李四这边看到警察来就立即通知张三,张三收到通知后立马逃跑...在上面的例子中,张三的角色其实就是观察者,李四是被观察者.张三观察李四这边的状态,如果李四这边的状态发生改变(一切正常->情况不妙),张三就立即做出行动或反馈.现实中类似的还有消息的订阅和接收,比如微信公众号,其模式其实也是观察者模式.

2.为什么要使用观察者模式?

观察者模式可以降低系统耦合度,观察者和主体(被观察者)完美分离,另外主体的变化可以通知到所有匹配过的观察者,所有依赖于主体的对象都得到通知并自动刷新。

3.实现

先来看一下观察者模式的结构图:

观察者模式主要由观察者(Observer),主体(Subject)构成,再具体一点就是由抽象观察者(observer),抽象主体(subject),观察者实现类(concreteObserver),主体实现类(concreteSuject)构成,为了让代码具有更高的可扩展性,你还可以把主体写成抽象类,我这了为了演示就不写的太复杂了,感兴趣的可以看看百度百科提供的观察者模式-javaDemo,那段代码写的很精彩,值得一读.

Subject:

主体,存放所有观察者对象,存放自身状态,以及添加/移除观察者的方法,通知所有观察者的方法

/*** 被观察者对象*/
public class Subject {private List<Observer> observers = new ArrayList<>();private Integer state;public void attach(Observer observer) {observers.add(observer);}public void remove(Observer observer) {observers.remove(observer);}private void notifyALLObserver() {for (Observer observer : observers) {observer.update();}}public Integer getState() {return state;}public void setState(Integer state) {this.state = state;this.notifyALLObserver();}
}

observer:

观察者对象,提供了update方法,以供在收到通知时及时作出反应.

/*** 观察者对象*/
public abstract class Observer {protected Subject subject;public abstract void update();
}

下面我以一个具体的例子来模拟实现观察者模式. 现在有一对情侣,主体是丈母娘,只有在丈母娘状态发生改变时(???)情侣才能作出具体的反馈,比如丈母娘的状态由1变为了2(可以理解为生气变成了高兴),这个时候男生看到后会立刻去打游戏,女生看到后则会去购物,代码模拟实现一下:

public class BoyObserver extends Observer {/*** 被构造时即被添加至观察者列表里*/public BoyObserver(Subject subject) {this.subject = subject;this.subject.attach(this);}@Overridepublic void update() {System.out.println("状态改变了,状态值变为了:" + subject.getState() + "  我要去打游戏了....");}
}public class GirlObserver extends Observer {/*** 被构造时即被添加至观察者列表里*/public GirlObserver(Subject subject) {this.subject = subject;this.subject.attach(this);}@Overridepublic void update() {System.out.println("状态改变了,状态值变为了:" + subject.getState() +"  我要去购物了....");}
}
/*** 测试客户端*/
public class Client {public static void main(String[] args) {Subject subject = new Subject();Observer girlObserver = new GirlObserver(subject);Observer boyObserver = new BoyObserver(subject);System.out.println("==========第一次===========>");subject.setState(1);System.out.println("==========第二次===========>");subject.setState(2);System.out.println("==========第三次===========>");subject.remove(boyObserver);subject.setState(3);}
}

运行一下测试类可以看到控制台输出:

第一次当主体状态变为1时,男孩和女孩都收到了通知,于是两人都去干自己喜欢的事了,第二次也一样,第三次时,丈母娘不高兴让男孩打游戏了,觉得这样没出息,于是把他从列表里踢出去了,然后他就收不到通知了...

以上便是观察者模式的简单实现,如果想要提高代码的可扩展性,可以把主体写得更抽象,运用泛型和反射,让代码的扩展性爆棚.

【设计模式】-09观察者模式相关推荐

  1. 设计模式:观察者模式--Observer

    一.什么是观察者模式 1.生活中的观察者模式 1.警察抓小偷 在现实生活中,警察抓小偷是一个典型的观察者模式「这以一个惯犯在街道逛街然后被抓为例子」,这里小偷就是被观察者,各个干警就是观察者,干警时时 ...

  2. java 观察者模式_图解Java设计模式之观察者模式

    图解Java设计模式之观察者模式 天气预报项目需求 天气预报设计方案 1 - 普通方案 观察者模式(Observer)原理 观察者模式解决天气预报需求 观察者模式在JDK应用的源码分析 天气预报项目需 ...

  3. 游戏服务器架构-设计模式之观察者模式和发布订阅模式真的一样吗?

    前面我给大家分享了观察者模式和发布订阅模式,有人私信给我说这俩不是一样嘛,大体没什么区别,我猜测大多数认为这两者是一样的可以继续阅读这两篇文章,如果还不能解答你的问题,我相信这篇文章对比两者的关系会让 ...

  4. java设计模式观察者模式吗_Java设计模式之观察者模式原理与用法详解

    Java设计模式之观察者模式原理与用法详解 本文实例讲述了Java设计模式之观察者模式原理与用法.分享给大家供大家参考,具体如下: 什么是观察者模式 可以这么理解: 观察者模式定义了一种一对多的依赖关 ...

  5. 设计模式 C++观察者模式

    无论是在现实世界中还是在软件系统中,人们常常会遇到这样一类问题,一个对象的状态改变会引发其他对象的状态改变,如十字路口的交通信号灯,红灯亮则汽车停,绿灯亮则汽车行,再如点击软件中一个按钮,则会弹出一个 ...

  6. 学习《图说设计模式》观察者模式

    图说设计模式之观察者模式 1. 模式动机 建立一种对象与对象之间的依赖关系,一个对象发生改变时将自动通知其他对象,其他对象将相应做出反应.在此,发生改变的对象称为观察目标,而被通知的对象称为观察者,一 ...

  7. 设计模式之观察者模式——猫抓老鼠2

    设计模式之观察者模式--猫抓老鼠2: 对猫抓老鼠1再次进行优化,降低代码复杂性,以及使用事件来对方法进行保护 代码优化: 将老鼠代码进行优化,将自己的方法在构造时便注册到猫里面: using Syst ...

  8. 设计模式之观察者模式——猫抓老鼠1

    设计模式之观察者模式--猫抓老鼠: 问题描述: 通过猫抓老鼠的例子进行了解观察者模式,首先的初始代码为(有三个类): using System;/// <summary> /// 观察者设 ...

  9. 设计模式学习--观察者模式(Observer Pattern)

    设计模式学习--观察者模式(Oberser Pattern) 2013年5月18日 天气:热!  下午15:28  设计模式学习中 学习者:小巫 什么是观察者模式? 定义了对象之间的一对多依赖,这样一 ...

  10. 「设计模式(二) - 观察者模式」

    「设计模式(二) - 观察者模式」 一.回复TD退订 日常生活中,这种短信无处不在,各种广告,在互联网高速发展的今天,个人信息可以说是透明的.没有任何隐私可言,类似这种通知其实跟我们开发过程使用的观察 ...

最新文章

  1. python画折线图详解-利用python画出折线图
  2. 大数据数据收集数据困难_大数据架构、大数据开发与数据分析的区别
  3. 转:C# Interview Questions
  4. 一个追求高效的学习者手机里装有哪些APP?(转)
  5. docker 设置阿里云加速器
  6. 百度搜索引擎推出“熊掌号”,保护原创作者权益
  7. 开源的看板管理工具Wekan
  8. 研究生阶段记录3-PCR介绍
  9. C# MVC 过滤器
  10. ERROR 1046 (3D000): No database selected
  11. boost::math::binomial_distribution用法的测试程序
  12. 手把手教你用Python高仿一个任务管理器
  13. 粉笔网页端资料分析仿ipad分屏插件开发完成总结
  14. java毕业设计瓷砖仓库管理mybatis+源码+调试部署+系统+数据库+lw
  15. 能定位的不仅GPS,还有它!
  16. 数据分析师—Excel函数篇
  17. Ubuntu 14.04更新源
  18. 概率论与数理统计(Probability Statistics I)
  19. 遥感影像如何导入Photoshop软件进行PS调色之智拼图Photoshop交互工具使用技巧
  20. 千亿龙头开启价格血拼,四个重要消息将影响这几个板块的走势

热门文章

  1. 使用 Tensorflow 2 进行自定义对象检测的一般方法
  2. SUSE 与 openSUSE的区别
  3. 使用var、let、const声明变量
  4. 你到底能有多聪明(智力)
  5. Win10关闭wacom长按右键
  6. Android自定义权限与使用
  7. Delphi中的匿名方法
  8. 关于long long
  9. em和px及其换算方法
  10. 在华为做了5年测试,8月被无情辞退,想给还在摸鱼的兄弟提个醒...