设计模式 “续”

观察者模式

再次申明,本文学习自 程杰 兄的 “大话设计模式” 根据书中的内容和自己的体会而来。

观察者模式也叫 发布、订阅模式,在这个模式里,一个目标物件管理所有依赖它的观察者物件,在本身状态更改时发出通知,通知将被观察者接收到。

书中用例子 炒股 来形容了这一点,在炒股的同事是观察者,依赖于前台妹子。当老板来的时候向炒股的同事发出通知,但是问题是 前台妹子与炒股的同事耦合在一起,这并不符合依赖倒置原则。所以把发布者与观察者都进行抽象,它们都依赖于抽象,这样就解开了之间的关系。

解决了依赖问题,但是新的问题又来了,因为不是所有的观察者方法名都是一样的,都叫 Update可能不是很严谨,而且在使用别人的代码的时候这些就不是你能控制的了。使用委托,把方法做为参数代入发布者的通知方法则可以解决这下问题。

这种模式通常被用在实现事件处理系统,当一个对象的改变需要同时改变其它对象,而且它不知道具体有多少对象待改变时。

时间: 2025-01-10 16:16:54

设计模式 “续”的相关文章

从引用传递到设计模式(续)

上一篇文末,提到非虚拟接口 NVI 的实现,即将虚函数声明为保护型或私有型,借由模板函数模式来实现 . 园友 @KillU 看的很仔细,提出了一个问题:虚函数是 private 类型,继承可以么? 答案是:完全可以 5  实现权和调用权 <Effective C++> 中给的解释是: 重写一个虚函数,指的是如何做事情 (how), 而调用一个虚函数,指的是什么时候做事情 (when) NVI 或 模板函数模式中,允许派生类重写虚函数,赋给派生类的是“实现权” - 即函数功能的实现:但是基类仍然

单例设计模式续--有上限的多例设计

package Singleton_Pattern; import java.util.ArrayList; import java.util.Random; //让一个类最多产生指定数量的对象,即有上限的多例模式 public class demo3 { public static void main(String[] args) { int ministerNum = 5; for(int i=0;i<ministerNum;i++){ Emperor2 emp = Emperor2.get

设计模式:工厂模式(续:虚构造函数和抽象工厂)

在之前的<设计模式:工厂模式>中记录了两种用于创建派生类对象的工厂模式,第一种模式直接使用基类的静态成员函数来创建派生类的对象,在该静态成员函数中直接调用了派生类的构造函数,第二种模式是使用基类工厂的静态成员函数,通过基类工厂中保存的各派生类工厂来创建派生类对象,派生类工厂是派生类的嵌套类,相当于为派生类量身定做的专属工厂,这些专属工厂的存在使得基类工厂不必了解创建派生类对象的细节.今天主要记录另外两种工厂模式:虚构造函数和抽象工厂.虚构造函数模式与前两种工厂模式不同,在前两种工厂模式中,基类

设计模式一(续)

本篇是接着设计模一:观察者模式的续写. 为什么要写这一篇呢: java在main函数里new出的对象都是局部变量,而用C++ 在main函数里new出来的都是 动态分配到堆区的. 那么可不可以按照java的思路来写呢. 这就是写本篇的原因了:C++完全可以按照java的思路来实现(使用引用) 附上代码: #include "stdafx.h" #include<iostream> #include<string> #include<vector> u

设计模式(1):只执行一次的函数(续)

概述 最近最近做项目的时候总会思考一些大的应用设计模式相关的问题,我把自己的思考记录下来,供以后开发时参考,相信对其他人也有用. 闭包之殇 本来上篇写的好好地,看起来逻辑也很清晰,但是实际用起来发现了一个巨大的坑.那就是,闭包中的变量将会共享!!! // utils.js export function runOnce(func) { let runOnce = true; return function(params) { if (runOnce) { func.apply(this, par

akka设计模式系列-消息模型(续)

在之前的akka设计模式系列-消息模型中,我们介绍了akka的消息设计方案,但随着实践的深入,发现了一些问题,这里重新梳理一下设计方法,避免之前的错误.不当的观点给大家带来误解. 命令和事件 我们仍然把akka中的消息分为命令和事件两大类,但二者的具体含义和实现有一点变化.“命令,是指一个actor给另外一个actor发送指令做相关的业务逻辑:事件,则是actor对某个命令的响应结果,或者对其他事件的响应结果”.之前是这样定义的,但在具体的实践过程中发现了一些问题. 比如,命令如何归类?是根据命

DICOM医学图像处理:开源库mDCM与DCMTK的比较分析(一),JPEG无损压缩DCM图像(续)

背景: 上周通过单步调试,找出了开源库mDCM与DCMTK在对DICOM图像进行JPEG无损压缩时的细小区别,并顺利实现了在C++和C#环境下对DICOM图像的压缩.但是问题接踵而至啊,随着项目的深入,发现在单独的测试工程中可以实现的mDCM版本,在嵌入到项目整体中后,却意外地出现了错误,并未顺利实现DICOM图像的JPEG无损压缩.因此需要继续详细对比分析mDCM与DCMTK两者,期望寻找原因. 问题分析: 开启项目的日志功能后,得到的信息反馈为: No registered codec fo

24种设计模式--模版方法模式【Template Method Pattern】

周三,9:00,我刚刚坐到位置,打开电脑准备开始干活.“小三,小三,叫一下其它同事,到会议室,开会”老大跑过来吼,带着淫笑.还不等大家坐稳,老大就开讲了,“告诉大家一个好消息,昨天终于把牛叉模型公司的口子打开了,要我们做悍马模型,虽然是第一个车辆模型,但是我们有能力,有信心做好,我们一定要…(中间省略 20 分钟的讲话,如果你听过领导人的讲话,这个你应该能够续上)”动员工作做完了,那就开始压任务了,“这次时间是非常紧张的,只有一个星期的时间,小三,你负责在一个星期的时间把这批 10 万车模(注:

云计算设计模式(十三)——领导人选举模式

云计算设计模式(十三)——领导人选举模式 通过协调合作,在分布式应用程序的任务实例集合执行的操作,选举一个实例作为承担管理的其他实例责任的领导者.这个模式可以有助于确保任务实例不互相冲突,导致争用共享资源,或与其他的任务实例正在执行的工作无意中干扰. 背景和问题 一个典型的云应用包括行动协调的方式很多任务.这些任务都可以是实例运行相同的代码和需要访问相同的资源,或者它们可能是可并行工作,以执行复杂计算的各个部分. 任务实例可能为多的时间自主运行,但它也可能是必要的,以协调各实例的操作,以确保它们