设计模式之观察者模式

有时候在京东看到一些电子产品非常想买,但奈何没钱啊!只能每隔几天就上京东看看这件商品有没有降价,有几次都错过了优惠活动!这让我悔恨不已啊!!!后来才发现京东有个“关注商品”的功能,商品一旦降价就会立马给我推送信息!我居然一直没发现!自从知道有这个功能后,我……

其实设计模式里面也有一种模式类似于这种机制,那就是观察者模式。从此以后我再也没有错过商品的降价信息,

1.定义

观察者模式(Observer Pattern)建立一种对象与对象之间的依赖关系,一个对象发生改变时将自动通知其他对象,其他对象将相应做出反应。在此,发生改变的对象称为主题或者观察目标,而被通知的对象称为观察者,一个观察目标可以对应多个观察者,而且这些观察者之间没有相互联系,可以根据需要增加和删除观察者,使得系统更易于扩展。

观察者模式包含以下角色:

  1. 主题
  2. 具体主题
  3. 观察者
  4. 具体观察者

2.实例说明

以点外卖的例子来说,我们通常在饿了么、美团这些APP上点外卖,我们在APP下单后,相应餐厅的APP此时会提醒接单,与此同时配送员的手机APP会立马提醒抢单。这个时候,每个订单都是具体主题,而餐厅及配送员就是具体观察者,下面用代码来实现。

2.1 Observer接口

观察者都需要实现这个接口,当数据更新后,主题调用update()方法,把数据传送给观察者。

public interface Observer {public void update(String food, String address, String phone);
}

2.2 Subject接口

主题最起码需要实现三个方法,registerObserver()方法用于观察者订阅主题,removeObserver()用于观察者取消订阅主题,notifyObserver()用于推送最新数据给观察者。

public interface Subject {public void registerObserver(Observer observer);public void removeObserver(Observer observer);public void notifyObserver();
}

2.3 实现Observer接口

在构造的时候就订阅主题。

//餐厅
public class Restaurant implements Observer {private String food;public Restaurant(Subject subject) {subject.registerObserver(this);}@Overridepublic void update(String food, String address, String phone) {this.food = food;display();}public void display(){System.out.println("餐厅,有订单了!用户点的菜是:" + this.food + ",是否接单?");}public void  unlink(Subject subject){subject.removeObserver(this);}
}//配送员
public class DeliverGuy implements Observer {private String address;private String phone;public DeliverGuy(Subject subject) {subject.registerObserver(this);}@Overridepublic void update(String food, String address, String phone) {this.address = address;this.phone = phone;display();}public void display() {System.out.println("外卖员,有订单了!地址是:" + this.address + ",手机号码是:" + this.phone + ",是否接单?");}public void unlink(Subject subject) {subject.removeObserver(this);}
}

2.4 实现Subject接口

把所有订阅该主题的观察者对象放进一个ArrayList里,有数据更新的时候逐个调用它们的update()方法。

public class Application implements Subject {private ArrayList observers;private String food;private String address;private String phone;public Application() {observers = new ArrayList();}@Overridepublic void registerObserver(Observer observer) {observers.add(observer);}@Overridepublic void removeObserver(Observer observer) {int i = observers.indexOf(observer);if (i >= 0) {observers.remove(i);}}@Overridepublic void notifyObserver() {for (int i = 0; i < observers.size(); i++) {Observer observer = (Observer) observers.get(i);observer.update(food, address, phone);}}public void comeNewOrder(String food, String address, String phone) {this.food = food;this.address = address;this.phone = phone;notifyObserver();}
}

3.测试

测试代码和测试结果如下。

public class Test {public static void main(String args[]) {Application application = new Application();Restaurant restaurant = new Restaurant(application);DeliverGuy deliverGuy = new DeliverGuy(application);application.comeNewOrder("番茄炒蛋饭", "富华西路106号", "12345678910");deliverGuy.unlink(application); //该配送员送完上一单不想再送了,不再接受接单消息application.comeNewOrder("土豆牛肉饭", "富华东路178号", "18910245613");restaurant.unlink(application); //餐厅打烊了,不再接受订单消息application.comeNewOrder("番茄炒蛋饭", "富华西路123号", "17654245645");}
}

4.优缺点

4.1 优点

1.观察者模式可以实现表示层和数据逻辑层的分离,并定义了稳定的消息更新传递机制,抽象了更新接口,使得可以有各种各样不同的表示层作为具体观察者角色。
2.观察者模式符合“开闭原则”的要求。

4.2 缺点

1.如果一个主题有很多直接和间接的观察者的话,所有的观察者都通知会花费很多时间。
2.观察者模式没有相应的机制让观察者知道所观察的主题是怎么发生变化的,而仅仅只是知道主题发生了变化。

5.适用场景

观察者模式在软件开发中应用非常广泛,就比如我上面提到的京东降价消息,或者某团队战斗游戏中某队友牺牲将给所有成员提示等等,凡是涉及到一对一或者一对多的对象交互场景都可以使用观察者模式。

翔谈设计模式——观察者模式相关推荐

  1. 趣谈设计模式 | 观察者模式(Observer) :消息的发布与订阅

    文章目录 案例:文章推送 观察者模式 观察者模式的运作流程 观察者模式解决的问题 观察者模式大显身手 总结 要点 应用场景 生产者-消费者模型 VS 观察者模式 完整代码及文档 案例:文章推送 假设我 ...

  2. 浅谈Observer观察者模式

    一.前言 观察者模式其实最好的名称应该是"发布订阅"模式,和我们现在大数据之中的发布订阅方式比较类似,但是也有区别的地方,在上一个设计模式,我们学习了仲裁者模式,其中当控件的状态发 ...

  3. Python设计模式-观察者模式

    Python设计模式-观察者模式 代码基于3.5.2,代码如下; #coding:utf-8 # 观察者设计模式class observerInterface():def update(self,va ...

  4. 从《翔谈》说起,看美团

    翔谈说起 最近在读<翔谈>系列,最开始是想看看左晖那本,因为还是对于链家这种打通线上线下的玩法比较好奇,看看背后有什么方法论.线上互联网那套看的比较多了,线下的方法论接触的还比较少,好奇. ...

  5. [Head First设计模式]山西面馆中的设计模式——观察者模式

    原文:[Head First设计模式]山西面馆中的设计模式--观察者模式 系列文章 [Head First设计模式]山西面馆中的设计模式--装饰者模式 引言 不知不自觉又将设计模式融入生活了,吃个饭也 ...

  6. java设计模式--观察者模式(Observer)

    java设计模式--观察者模式(Observer) java设计模式--观察者模式(Observer) 观察者模式的定义: 定义对象间的一种一对多的依赖关系.当一个对象的状态发生改变时,所有依赖于它的 ...

  7. 【学习笔记】ABAP OOD设计模式 - 观察者模式

    ABAP OOD设计模式 - 观察者模式 整理转自-<SAP ABAP 面向对象程序设计(原则.模式及实践)> 定义对象间的一对多的依赖关系,当一个对象的状态发生改变时,这个对象相关依赖的 ...

  8. Java设计模式-观察者模式(订阅发布模式)

    Java设计模式-观察者模式(订阅发布模式) 一起来看 会了就当复习丫,不会来一起来看看吧. 很喜欢一句话:"八小时内谋生活,八小时外谋发展". 如果你也喜欢,让我们一起坚持吧!! ...

  9. 趣谈设计模式 | 模板方法模式(Template Method):封装不变部分,扩展可变部分

    文章目录 案例:房屋建造 模板方法模式 模板方法模式与策略模式 总结 完整代码与文档 这个设计模式过于简单,所以不是很好举例- 案例:房屋建造 假设我们是建筑公司中的规划者,负责设定建筑方案,在初期我 ...

最新文章

  1. TIOBE12月榜单:Java重回第二,Python有望四连冠年度语言
  2. Label中的自动换行
  3. 我来说说java的NIO
  4. SpringBoot打包成Docker镜像
  5. Code First 迁移,及迁移错误
  6. tomcat多域名配置
  7. 解决:网络风暴引起的无法ping通
  8. jsjavaScript打印99乘法表
  9. List集合排序之Java8stream流排序
  10. 转帖 分享代码自动生成
  11. Mutt电子邮件的使用
  12. School Regional Team Contest, Saratov, 2011-F. Spiders-求树直径
  13. 怎么将多张图片打印在一张A4纸上?
  14. 【解决方案】TSINGSEE青犀视频互联网直播/点播平台EasyDSS构建户外无人机直播
  15. VS2019编译python解释器源码及学习方法
  16. 不用计算机怎么算三角函数,1.不用计算机怎么求根式和三角函数值?
  17. ZOOM:1的原理和作用
  18. PKUWC2019 游记
  19. 【100个 Unity实用技能】| C# 中List 使用Exists方法判断是否存在符合条件的元素对象
  20. 怎么批量修改html文件后缀,如何批量修改文件后缀名 超详细介绍

热门文章

  1. hdoj杭电问题分类
  2. Cu 大彻大悟内存管理 mm (update 0410)
  3. S5P4418:RTC芯片HYM8563驱动移植
  4. 安卓linux病毒,如何清除linux病毒
  5. Algebraic Foundations ( Arithmetic and Algebra) CGAL 4.13 -User Manual
  6. ue/um-editor实现word图片复制
  7. 基于ATX自动化测试解决方案
  8. 一秒钟看懂SaaS、CRM、OA、ERP、HR、进销存
  9. 嵌入式系统下Microwindows的实现
  10. CDR插件开发之CPG插件018 - 在CPG插件中调用外部EXE程序并传递参数