文章目录

  • 专栏导航
  • 前言
  • 好莱坞原则
    • 工厂模式的思路借鉴
    • IOC的思路借鉴
  • 问题核心
    • 即时通讯的思路借鉴
    • GUI设计上的思路借鉴
  • 后记

专栏导航

优雅のJava(零)—— 面向问题的学习

前言

这篇主要是阐述一种思维 概念 怎么观察 是最高效优雅的

好莱坞原则

就好像比起班主任挨个问每个同学的作业写了没 VS 每个同学自己汇报 哪个效率高的问题 有个叫好莱坞原则的东西 编程导论有提到

好莱坞原则:“不用找我们,(时机成熟)我们会找你的 (don’t call us, we’ll call you)”
就是说在好莱坞,把简历递交给演艺公司后就只有回家等待。由演艺公司对整个娱乐项的完全控制,演员只能被动式的接受公司的差使,在需要的环节中,完成自己的演出。

其实 类似的思维贯穿了很多设计模式

工厂模式的思路借鉴

比如 前边讲到的工厂模式 就是 不用你去找每个类怎么制造 而是每个类提供他的BeanFactory 你执行就好

IOC的思路借鉴

还有后边第六篇要讲的 IOC控制反转 不需要你这个调用者 去操心被调用组件的生命周期管理(就是啥时候创建啥时候销毁) 而是容器主动根据你的需求 注入 送到你跟前

实际上这篇也是为第六篇做铺垫

问题核心

观察者模式定义了一个基本的 一对多的关系下 我们应当怎么操作 观察
当一个对象的状态发生改变 所有依赖这个对象都会被通知

我们观察这个对象 就好像订阅(subscribe) b站Up主 订阅这个 主题subject 而不是我们每隔五分钟就去給Up发私信 问 你更新了没呀(那估计要被Up鲨害了:)

然后Up如果更新了(异步),通知我们一声 推送push一个链接就好了
之前每五分钟问Up的操作 被称为Pull 拉取

当然是推送的效率更高 拉取就类似轮询操作

即时通讯的思路借鉴

玩过即时通讯的兄弟应该知道只是轮询 对系统性能的损耗是有多大!但是没办法 服务器并不能主动的通知客户端(HTTP无状态) 那些网络上的“订阅” 底层仍然是使用轮询实现 但可能更聪明 比如长轮询 或者如websocket发送心跳包维持连接的方式

GUI设计上的思路借鉴

还有就是 比如玩GUI的同学 可能见过几个关键侧 event事件 trigger 触发 这里同样适用观察者模式!我们想检测这按钮click的事件 难道靠轮询 拉取这个按钮的状态吗?假设1w个按钮 请问怎么拉取 又怎么判断哪个按钮被按下了呢? 相必非常耗损性能 但是如果设计成 按钮click以后 执行clickHandler 触发click事件 交给控制器处理 那就高效很多

当然 玩过电子 硬件二维键盘的同学应该知道 单片机检测按键按下 就是采用pull 单片机IO端口拉取(采样)电信号状态的方式来的 因为没啥别的好办法 最多做个降维 比如4X4 我只需要探测行 列 共八个IO口 就能确定几行几列的按钮被按下了 而不是4*4=16个IO

后记

总之 观察者模式很简单 但是贯穿了很多设计模式 我们面对一对多的情况 甚至设计数据库表结构的时候 都可以想想应该怎么处理为好

而多对多的应对之道 也就是拆成一对多+多对一

下一篇 第六篇 我们也将看到 依赖问题的解决上 是如何借鉴到观察者模式的些许思路

专栏导航
优雅のJava(零)—— 面向问题的学习

优雅のJava(五)—— 优雅的观察对象与订阅信息 观察者模式 好莱坞原则相关推荐

  1. Angular RxJS入门笔记 (Observable可观察对象、Subscribe订阅、Observer观察者、Subscription对象)

    RxJS入门笔记,关于Observable可观察对象.Observer观察者.Subscribe订阅,Subscription Observable可观察对象 Observer观察者 总结整体 本笔记 ...

  2. 如何编写高效优雅 Java 程序

    文章目录 编写高效优雅 Java 程序 面向对象 01.构造器参数太多怎么办? Builder 模式: 02.不需要实例化的类应该构造器私有 03.不要创建不必要的对象 04.避免使用终结方法 05. ...

  3. 优雅のJava(四)—— 优雅的理解代理模式

    文章目录 专栏导航 前言 代理 静态代理 RPC 静态代理 VS 装饰器 VS AOP 动态代理 VS 静态代理 RPC调用的例子 Why not Http? 动态代理实现AOP JDK动态代理 VS ...

  4. 怎样用Java 8优雅的开发业务

    怎样用Java 8优雅的开发业务 文章目录 怎样用Java 8优雅的开发业务 函数式编程 流式编程 基本原理 案例 优雅的空处理 新的并发工具类`CompletableFuture` 单机批处理多线程 ...

  5. 你的Kubernetes Java应用优雅停机了吗?

    假如我们从 kafka 拉取数据然后生成任务处理数据,在服务退出时,如何保证内存中的数据能被正常处理完不丢失呢?假如服务是部署在 Kubernetes 中又该如何处理? Java 应用优雅停机 我们首 ...

  6. Java第五课:类和对象

    Java第五课:类和对象 Java第五课:类和对象 1.1 上周回顾 1.2 作业讲解 1.3 类和对象: 1.4 面向对象: 1.4.1 类的概念: 1.4.2 类的基本结构: 1.4.3 对象的概 ...

  7. 我们一起来排序——使用Java语言优雅地实现常用排序算法

    破阵子·春景 燕子来时新社,梨花落后清明. 池上碧苔三四点,叶底黄鹂一两声.日长飞絮轻. 巧笑同桌伙伴,上学径里逢迎. 疑怪昨宵春梦好,元是今朝Offer拿.笑从双脸生. 排序算法--最基础的算法,互 ...

  8. js中如何优雅修改一个多层嵌套list对象的值

    如何优雅更改一个N层嵌套对象属性的值 看下边的代码,要加工一个嵌套list的属性值,然后再赋值回去,大概只能这样写: dp.data.treelist = dp.data.treelist.map(. ...

  9. java自定义注解实现校验对象属性是否为空

    前面学习了如何自定义一个注解:java如何优雅的自定义一个注解 下面来实战演示一下如何使用自定义注解做一些实际的功能.比如校验对象属性是否为空. 一.自定义一个NotNull注解 我们自定义一个Not ...

最新文章

  1. UBuntu 系统设置禁用快捷键
  2. Nature子刊封面:澳大真菌研究新突破 有助降低免疫力弱人群受真菌感染的风险...
  3. bzoj1624:[Usaco2008 Open] Clear And Present Danger 寻宝之路
  4. IT规划宜分步走 忌盲目好大喜功(载)
  5. C++ Vector的使用
  6. (转)谷歌公开dopamine
  7. Go中的函数也是一种数据类型,可以赋值给一个变量
  8. 【转】IOS制作静态库
  9. 阿里云存储OSS中设置上传文件content type
  10. Eclipse调试方法
  11. 单边指数信号的特点_今日股市分析:上证指数若能守住3400,蓄力反弹就有戏...
  12. 辟谣|bitcoin core0.16.1版本没有删除区块大小限制——带你认识区块大小限制参数...
  13. 湖南师大计算机学信网,湖南师范大学有计算机专业硕士吗?
  14. [Ext JS]5.11 轻量版的树- treelist
  15. 2018阿里文学春招面试题
  16. Visual Studio 代码提示选不中
  17. Solidity语言基础 和 Etherum ERC20合约基础
  18. mac 安装appium
  19. MATLAB2015a中Simulink使用S函数的方法全过程
  20. Unity 3D模型展示素材

热门文章

  1. 聊聊跨端技术的本质与现状
  2. 极客时间计算机组成原理学习笔记
  3. 两大数据库安全产品比拼:IBM Guardium VS Imperva SecureSpher
  4. 深入了解机器学习 (Descending into ML):线性回归
  5. js隐藏android软键盘,如何使用JavaScript隐藏Android键盘?
  6. iPhone 的解锁、越狱、激活、固件等等是什么意思,有什么分别?
  7. 简述现代计算机系统如何进行多级划分,现代计算机系统是如何进行多级划分?...
  8. sort函数使用cmp出错Line 22: Char 38: error: reference to non-static member function must be called
  9. git bash的安装和配置教程
  10. 十六进制文件读取并转换成二进制文件