不知道大家有没有听说过观察者模式,有人也叫发布-订阅模式,我们先来看一个案例,案例如下:一个公司有前台人员,和后台开发人员,公司老板回来的时候会先经过前台然后才来到后台开发这边,工作压力大,后台开发人员偶尔会偷偷懒,炒一下股或者看看NBA这些小工作,他们串通前台的人员,如果老板回来要先通知他们,好让他们有个准备。程序实现如下:

第一步:我们把前台人员称为通知者,我们抽象通知者,因为通知者可能是前台人员或者其他人,但是具有相同的行为,于是可以使用接口来规范行为。

//抽象通知者
public interface Subject {//添加public void attach(Observer observer);//通知所有的观察者public void notifyAllObserver();}

第二步:前台人员是具体的通知者,实现接口Subject,有三个私有属性,姓名,自己的状态,以及需要通知的观察者,我们把后台开发人员称为观察者,他们可能在看NBA,或者看篮球等等。当老板回来的时候,通知者需要改变自己的状态,通知所有的观察者对象,当然通知者肯定有添加观察者的方法,就是添加需要通知的观察者,这里有两个具体的通知者,一个是前台人员,一个是老板,我们都不希望是老板来通知我们~~

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;//抽象通知者
public class Secretary implements Subject {private String name;  //姓名private String action; //状态private List<Observer> observers = new ArrayList<Observer>(); //观察者集合//添加public void attach(Observer observer) {observers.add(observer);}//通知所有的观察者public void notifyAllObserver() {for (Iterator<Observer> iter=observers.iterator(); iter.hasNext();) {Observer observer = iter.next();observer.update();}}public String getAction() {return action;}public void setAction(String action) {this.action = action;}public String getName() {return name;}public void setName(String name) {this.name = name;}}
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;//通知者
public class Boss implements Subject{private String name;  //姓名private String action; //状态private List<Observer> observers = new ArrayList<Observer>(); //观察者集合//添加public void attach(Observer observer) {observers.add(observer);}//通知所有的观察者public void notifyAllObserver() {for (Iterator<Observer> iter=observers.iterator(); iter.hasNext();) {Observer observer = iter.next();observer.update();}}public String getAction() {return action;}public void setAction(String action) {this.action = action;}public String getName() {return name;}public void setName(String name) {this.name = name;}}

第三步:抽象观察者,因为我们知道观察者有各种各样的,在做什么事情,我们都不知道,但是老板回来,我们就需要通知他们。
于是我使用抽象类来定义,而不使用接口,因为抽象类可以有属性,即是状态数据字段,定义一个抽象的方法,就是更新自己的状态,也有一个通知者的引用,进而和通知者联系。

//抽象观察者
public abstract class Observer {protected String name;  //姓名protected Secretary secretary; //通知者//constructorpublic Observer(String name, Secretary secretary) {this.name = name;this.secretary = secretary;}//更新状态public abstract void update();}

第四步:我们来两个具体的观察者,一个在看NBA,一个在炒股。

//NBA观察者
public class NBAObserver extends Observer{public NBAObserver(String name, Secretary secretary) {super(name, secretary);}//更新状态public void update() {System.out.println(secretary.getAction() + " " + this.name + "不要看篮球了,继续工作。");}
}
//股票观察者
public class StockObserver extends Observer{public StockObserver(String name, Secretary secretary) {super(name, secretary);}//更新状态public void update() {System.out.println(secretary.getAction() + " " + this.name + "关闭股票行情,继续工作。");}
}

第五步:接下来就是测试一下了。我们定义一个通知者、两个观察者,通知者是老板,老板回来的时候通知我们的两个观察者,很糟糕哦~~

//测试
/*** 分析:我们使用继承与多态的方式重构了程序,抽象了观察者和通知者,因为观察者可能是在看NBA,* 也可能在看股票或者其他,而通知者也一样,可能是老板,也可能是是我们上司,但是通知者具有相* 同的行为,于是可以使用接口来定义抽象,使用依赖倒置的原则,可以使得程序的可拓展性大大提高* ,代码的可重用性也提高。*/
public class Test2 {public static void main(String[] args) {Secretary boss = new Secretary(); //通知者Observer xiaowang = new StockObserver("小王", boss); //股票玩家Observer xiaodong = new NBAObserver("小东", boss); //股票玩家//通知者记录boss.attach(xiaowang);boss.attach(xiaodong);//通知者状态发生改变boss.setAction("老板我回来了!");//通知所有的观察者即股票玩家boss.notifyAllObserver();}}

总结:

观察者模式也叫发布-订阅模式。定义:观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象 。这个主题对象在状态发生变化的时,会通知所有的观察者对象,使它们能够自动的更新自己。

遵循的原则:依赖倒置的原则、里氏替换原则。

特点:将一个系统分隔成一系列相互协作的类有一个很不好的副作用,那就是需要维护相互对象将的一致性,我们不希望为了维护一致性而是各类紧密相连,这样会给维护、扩展和重用都带来不便。

使用场景:1.当一个对象改变时需要同时改变其他对象的时候。(不需要知道具体需要改变的对象)

大话设计模式之观察者模式相关推荐

  1. 大话设计模式(五)观察者模式

    一.概念 在阎宏博士的<JAVA与模式>一书中开头是这样描述观察者(Observer)模式的: 观察者模式是对象的行为模式,又叫发布-订阅(Publish/Subscribe)模式.模型- ...

  2. 大话设计模式Python实现-观察者模式

    观察者模式(发布-订阅模式 Publish Subscribe Pattern):定义了一种一对多的关系,让多个观察对象同时监听一个主题对象,当主题对象状态发生变化时会通知所有观察者,是它们能够自动更 ...

  3. 大话设计模式—观察者模式

    当对象间存在一对多关系时,则使用观察者模式(Observer Pattern).比如,当一个对象被修改时,则会自动通知它的依赖对象.观察者模式属于行为型模式.主要解决一个对象状态改变给其他对象通知的问 ...

  4. java 之 观察者模式(大话设计模式)

    观察者模式,笔者以前做校验订单时用过一次,只是不知道有这个模式,当时使用观察者省略了N多if else 在笔者看来观察者模式比较试用于一个对象状态改变后,很多个对象也要根据这个状态做相应的动作,当然观 ...

  5. [大话设计模式C++版] 第14章 老板回来,我不知道 —— 观察者模式

    源码可以在这里找到 大话设计模式C++版 双向耦合的代码 //Secretary.h 秘书类 #include <QList>using namespace std; class Stoc ...

  6. 《大话设计模式(C#实现)》(Yanlz+VR云游戏+Unity+SteamVR+云技术+5G+AI+设计模式+GoF+UML+单例模式+观察者模式+抽象工厂+代理模式+框架编程+立钻哥哥++OK+)

    <大话设计模式(C#实现)> 版本 作者 参与者 完成日期 备注 YanlzFramework_GoF_V01_1.0 严立钻 2020.02.10 ##<大话设计模式(C#实现)& ...

  7. 设计模式之观察者模式(Observer)摘录

    23种GOF设计模式一般分为三大类:创建型模式.结构型模式.行为模式. 创建型模式抽象了实例化过程,它们帮助一个系统独立于如何创建.组合和表示它的那些对象.一个类创建型模式使用继承改变被实例化的类,而 ...

  8. 【Python】《大话设计模式》Python版代码实现

    <大话设计模式>Python版代码实现 上一周把<大话设计模式>看完了,对面向对象技术有了新的理解,对于一个在C下写代码比较多.偶尔会用到一些脚本语言写脚本的人来说,很是开阔眼 ...

  9. 【大话设计模式】设计模式系统学习大合集

    转载请注明出处:http://blog.csdn.net/column/details/designpatternbylmb.html 为了方便各位网友学习以及方便自己复习之用,将设计模式的系列内容按 ...

最新文章

  1. 深入理解Java的接口和抽象类
  2. AI视觉组基于ESP32的裁判系统第一版本设计要求
  3. linux查看fifo内容,linux 有名管道(FIFO)
  4. 同步中断和异步中断区别
  5. Ehab and Prefix MEXs CodeForces - 1364C(思维)
  6. 看了通信领域中信息的处理的三种方式我终于知道电报能发送信息的原理了
  7. aws ec2 选择可用区_AWS Messaging Services:选择合适的服务
  8. 前端/JS笔记-利用JS/正则判断input是否存数字以及字母加数字
  9. CSU 1112 机器人的指令
  10. 【Hadoop】HDFS Short Circuit Local Reads(HDFS短路读取)
  11. 支付业务与技术架构学习总结(8)——支付系统设计包含:账户,对账,风控...
  12. 【线性代数及其应用】02 -矩阵代数
  13. chartControl控件常用属性总结
  14. android设计简单计算器代码下载,简单计算器实例
  15. 用友u8 php,php读取用友u8采购入库单列表及详细
  16. python代码运行速度有点慢 ? 教你使用多线程速度飞升
  17. Django模型中的关系:一对一、一对多与多对多
  18. 这份新年豪礼面试锦囊,真舍不得给你们!
  19. 微信营销 html5,五大经典HTML5微信互动营销成功案例,你都玩过了吗?
  20. 我查查 并行数据处理应对突发流量

热门文章

  1. 大数据分析案例-基于随机森林算法构建人口普查分析模型
  2. Python爬虫之Scrapy框架系列(16)——深入剖析request和response类
  3. android计算器工程布局,Android 计算器布局测试
  4. ASUS WIN7 DRIVER
  5. sql盲注如何修补_如何修复SQL注入漏洞
  6. java 如何抛异常_如何在Java中抛出异常?
  7. 推荐一个格式化json数据的谷歌插件JSONView:谷歌浏览器中JSONVue扩展程序插件jsonview的下载与安装
  8. python 便利店收银系统_前端开发之便利店收银系统代码
  9. Sqlserver 修改字段长度
  10. 移动端APP测试用例