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

一、回复TD退订

日常生活中,这种短信无处不在,各种广告,在互联网高速发展的今天,个人信息可以说是透明的。没有任何隐私可言,类似这种通知其实跟我们开发过程使用的观察者模式(Observer Pattern)如出一辙。更贴切的像初中时代,英语学习的周报订阅,一个班级大部分还是会订阅,基本上一周一期。这个算是比较典型的观察者模式也即-发布-订阅。可以这样理解,Publishers+Subscribers=Obeserver Pattern。像这种一对多的关系,一个对象状态的改变,所有订阅它的对象都会被通知到并进行自己的一些操作可以用观察者模式来解释。

二、观察者模式 Obeserver Pattern

对象之间存在像这种一对多的依赖关系,当被订阅的对象(Publishers)状态发生变化时,订阅者们(Subscribers)会收到相应的通知并作出相应的操作(更新自身的状态或行为操作),即为观察者模式,是一种对象行为型模式。

三、组成部分

以上述为例:

  • 需要抽象的主题(Subject),英语周报就是这个主题,直观思考就可以理解,需要存储所有订阅了的学生(Observers),以便确保每个订阅的学生都能收到。需要可以删除不在订阅的学生(Observer),那么同样的也可以新增想要订阅的学生(Observer)。

    发布者Subject 需要持有所有的订阅者,并提供新增、删除订阅的方法,通知订阅者们自身状态改变的抽象方法(Notify)

  • 需要抽象的订阅者(Observser),学生在这里可以作为充当订阅者的角色,可以抽象为Observer,更加通用一点,老师同样可以订阅,其他有需要的人一样可以订阅。Observer即可理解为角色的抽象。

    订阅者Observer,抽象的接口或抽象类(一般常见的为接口),提供更新自己行为、或属性的抽象方法

  • 需要具体订阅者实现类(Concrete Observer),前面提到了,学生仅仅是众多订阅类型的一种,任何有需要的人都可以订阅,仅需实现Observer接口即可,设计的易扩展性。

  • 同样的具体主题实现者(Concrete Subject),是对Subject的具体实现,好处不用多说,这也是为什么我们在学习设计模式之初首先需要理解六种基本的设计原则。抽象不依赖实现细节,细节应该依赖抽象,抽象约束了细节使细节更规范可控

  • 结构图:

四、代码实现
1.设计一个价格变动系统

水果店里的水果众多,应季水果通常很贵,像现在这个季节的车厘子(还没实现车厘子自由

「设计模式(二) - 观察者模式」相关推荐

  1. 二进制里的「逢二进一」是什么意思

    这个回答里包括如下内容,逐步更新. 什么是二进制.为什么有二进制.二进制与十进制是什么关系,如何转换. 数是无穷多的,但是我们只有有限多个符号.因此我们需要使用有限多的符号来表示无限多的数.在这种表示 ...

  2. CPM-2细节发布!10大技术打通大模型「任督二脉」,单卡单机跑「千亿模型」不再是梦...

    智源导读:最近两年,预训练模型的参数量以每年 10 倍的速度迅猛增长,然而其计算效率的瓶颈也日渐显现. 例如以单块NVIDIA V100 GPU训练,GPT-1的计算时间是 3 天,到GPT-2 计算 ...

  3. 「设计模式(六) - Builder模式」

    「设计模式(六) - Builder模式」 一.可定制化的 电脑的组装在生活中并不陌生,大家都有电脑,当然需求不一样配置也不一样.以Macbook Pro为例,像UI设计对图像模块GPU要求比较高,跑 ...

  4. 「设计模式(五) - 代理模式」

    「设计模式(五) - 代理模式」 一.处处可见的"代理" "代理"在平常生活司空见惯,点外卖,租房子找中介,买飞机票等等.基本上用手机就能完成,也就是不直接接触 ...

  5. 「设计模式」六大原则之三:里氏替换原则小结

    文章目录 1.里式替换原则定义 2. 举例说明 示例1: 示例2: 3. 哪些代码明显违背了 LSP? 子类违背父类声明要实现的功能 子类违背父类对输入.输出.异常的约定 子类违背父类注释中所罗列的任 ...

  6. 手撕设计模式之「工厂方法模式」(Java描述)

    前言 工厂方法模式是对简单工厂模式的改进,它通过对工厂类进行抽象形成一个抽象工厂接口,再让具体的工厂负责对应产品的创建,使得在增加产品的场景中也满足"开闭原则".希望通过本文的学习 ...

  7. 程序员经常说的「设计模式」到底是什么?

    当程序员说去「设计模式」时,你是否会一脸懵逼,到底什么是设计模式呢? 很多人应该听说过设计模式(Design pattern),又或多或少的看过或用过设计模式,但是实际用在开发过程中总有点心有余而力不 ...

  8. 「docker实战篇」python的docker爬虫技术-安卓模拟器(二)

    原创文章,欢迎转载.转载请注明:转载自IT人故事会,谢谢! 原文链接地址:「docker实战篇」python的docker爬虫技术-安卓模拟器(二) 为什么要手机模拟器,如果有条件正好有不使用的安卓手 ...

  9. 噢,我这该死的魅力,国潮新锐品牌「二某某」她来了她来了

    做工厂做产品的人不浪漫?人称「彭老师」的彭伊朵并不同意,彭伊朵毕业于北师大,曾是中学语文老师,深耕制造业数十年后毅然创立「二某某」,成为品牌创始人.彭伊朵与她的团队深谙产品的结构原理.生产流程及外观设 ...

最新文章

  1. Dubbo Cloud Native 实践与思考
  2. openstack 使用集锦
  3. html语言调用图片,css文件中怎么引用图片?
  4. 使用注解配置声明式事务控制
  5. 计算机网络应用押韵句,现代汉语练习题
  6. 极简的 PNG 编码函数 svpng(),用来学习C语言,真的很爽
  7. MyBatis学习总结(27)——Mybatis-Plus使用小技巧
  8. 6.Nginx 的 Rewrite 规则
  9. JAVA数据类型转换大全
  10. 软件测试人员工作计划怎么写,软件测试个人工作计划.docx
  11. C语言error2005,关于ERROR LNK 2005错误
  12. python数据分析002—python基础语法
  13. iso14443_TypeB TR0/TR1/TR2 时序观测
  14. Android BroadcastReceiver详解
  15. linux module load, show, 包管理,找到包的路径
  16. java 软尾 铝_软尾入门车款:JAVA FURIA 27.5上市
  17. 前端面试题库 面试题 JS难题,做对一半就是高手
  18. 程序猿从不缺对象,想要随时可以new出来一个
  19. 02 | 安全原则:我们应该如何上手解决安全问题?
  20. IEEE | DSConv: Efficient Convolution Operator

热门文章

  1. selenium/requess爬取京东手机商品的详细信息1~selenium练习版
  2. 数学学习在计算机研究领域的作用和重要性
  3. 服务客户的重要原则:“悦近来远”
  4. Automation Anywhere视频教程
  5. js实现上下左右移动小方块
  6. 【jQuery】一个动画的例子
  7. C语言中函数参数传递的方式:值传递,地址传递
  8. 使用阿里云视频点播上传视频
  9. SpringBoot banner图样
  10. ffmpeg重采样中swr_convert和swr_get_out_samples的用法