[GeekBand] 设计模式之观察者模式学习笔记
本文参考文献::GeekBand课堂内容,授课老师:李建忠
:网络资料: http://blog.csdn.net/hguisu/article/details/7556625
本文仅作为自己的学习笔记,不代表权威,因为是初学,有错误烦请大家指正,谢谢。
1、什么是观察者模式,应用场所有哪些?
观察者模式(有时又被称为发布-订阅Subscribe>模式、模型-视图View>模式、源-收听者Listener>模式或从属者模式)是软件设计模式的一种。在此种模式中,一个目标物件管理所有相依于它的观察者物件,并且在它本身的状态改变时主动发出通知。这通常透过呼叫各观察者所提供的方法来实现。此种模式通常被用来实现事件处理系统。
--------360百科定义
2、结构

3、通过代码分析,模式的组成
如上图所示:观察者模式包含如下角色:
目标(Subject): 目标知道它的观察者。可以有任意多个观察者观察同一个目标。 提供注册和删除观察者对象的接口。
//目标: 目标知道它的观察者。可以有任意多个观察者观察同一个目标。 提供注册和删除观察者对象的接口。
Class Form
{
public:
virtual void Attach(FileSpliter* observer);//注册观察者
virtual void Detach(FileSpliter* observer);//释放观察者
virtual void Notify();//通知所有注册的观察者 interface SplObserver
{
virtual void Update(Form *) = ; //观察者进行更新状态
};
}
具体目标(ConcreteSubject): 将有关状态存入各ConcreteObserver对象。
//具体目标(MainForm): 将有关状态存入各MainForm对象 class MainForm : public Form
{
public:
/**
* 释放观察者
*/
virtual void Attach(FileSpliter* observer)
{
_observers->Append(observer);
}
/**
* 注册观察者
*/
virtual void Detach(FileSpliter* observer) //
{
_observers->Remove(observer);
}; /**
* 通知所有观察者
*/
virtual void Notify()
{
for obs in _observers //遍历
{
if (observers->getState() == this->State)
{
obs->Update(this);
}
}
}; //设置状态
void Button1_Click(bool State)
{
this->State = State; //状态改变
Notify();
} protected:
MainForm() {}
private:
TestBox* txtFilePath;
TextBox* txtFileNumber;
ProgressBar* progressBar;
List<FileSpliter*> *_observers;
};
观察者(Observer): 为那些在目标发生改变时需获得通知的对象定义一个更新接口。当它的状态发生改变时, 向它的各个观察者发出通知。
/**
* 抽象观查者
*
*/
class FileSplitter
{
public: virtual void Split() = ;
virtual void Update(MainForm*) = ;
virtual ~FileSplitter() {} protected:
virtual void onProgress(float value)
{ List<FileSpliter*>::iterator itor = _observers.begin(); while (itor != _observers.end())
(*itor)->DisplayProgress(value); //更新进度条
itor++;
}
void DisplayProgress(int value)
{
progressBar->setValue(value);
}
}
private:
string filePath;
int fileNumber;
bool State;
};
具体观察者(ConcreteObserver): 维护一个指向ConcreteSubject对象的引用。存储有关状态,这些状态应与目标的状态保持一致。实现Observer的更新接口以使自身状态与目标的状态保持一致。
//具体观察者1
class Spliter1 : public FileSplitter
{ public:
Spliter1(MainForm* mf)
{
_subject = mf;
_subject->State = true;
_subject->Attach(this);
}
virtual ~Spliter1()
{
_subject->State = false
_subject->Detach(this);
}
virtual void Update(MainForm *mf)
{
_subject->State = true;
if (mf == _subject)
{
Split()
}
}
virtual void Split()
{
//1、打开文件filePath
//2、把文件分割成fileNumber个文件
//3、DisplayProgress重载,以1的方式更新进度(如进度条)
DisplayProgress(value);
} private:
bool State;
MainForm* _subject;
}; //具体观察者2
class Spliter2 : public FileSplitter
{ public:
Spliter2(MainForm* mf)
{
_subject = mf;
_subject->State = true;
_subject->Attach(this);
}
virtual ~Spliter2()
{
_subject->State = false;
_subject->Detach(this);
}
virtual void Update(MainForm *mf)
{
_subject->State = true;
if (mf == _subject) {
Split()
}
}
virtual void Split()
{
//1、打开文件filePath
//2、把文件分割成fileNumber个文件
//3、DisplayProgress重载,以2的方式更新进度(如控制台...)
DisplayProgress(value); private:
MainForm* _subject;
bool State;
}; //具体观察者3
class Spliter3 : public FileSplitter
{ public:
Spliter3(MainForm* mf)
{
_subject = mf;
_subject->State = true;
_subject->Attach(this);
}
virtual ~Spliter3()
{
_subject->State = false;
_subject->Detach(this);
}
virtual void Update(MainForm *mf)
{
_subject->State = true;
if (mf == _subject)
{
Split()
}
}
virtual void Split()
{
//1、打开文件filePath
//2、把文件分割成fileNumber个文件
//3、DisplayProgress重载,以3的方式更新进度(如百分比)
DisplayProgress(value);
}
private:
MainForm* _subject;
bool State;
};
main函数
nt main()
{
MainForm* mf = new MainForm();
Spliter1* sp1 = new Spliter1(mf);
Spliter2* sp2 = new Spliter2(mf);
Spliter3* sp3 = new Spliter3(mf);
return ;
}
4、总结
1、通过Observer模式,把一对多对象之间的通知依赖关系的变得更为松散,大大地提高了程序的可维护性和可扩展性,也很好的符合了开放-封闭原则。
2、观察者模式符合开闭原则,开闭原则是指一个软件实体应该对扩展开放,对修改关闭。也就是说软件实体必须是在不被修改的情况下被扩展。模板方法模式意图是由抽象父类控制顶级逻辑,并把基本操作的实现推迟到子类去实现,这是通过继承的手段来达到对象的复用。
3、
模板方法模式与对象的封装性,面向对象的三大特性:继承,封装,多态。
对象有内部状态和外部的行为。封装是为了信息隐藏,通过封装来维护对象内部数据的完整性。使得外部对象不能够直接访问一个对象的内部状态,而必须通过恰当的方法才能访问。在C++中,采用给对象属性和方法赋予指定的修改符(public、protected、private)来达到封装的目的,使得数据不被外部对象恶意的访问及方法不被错误调用导造成破坏对象的封装性。
[GeekBand] 设计模式之观察者模式学习笔记的更多相关文章
- [GeekBand] 设计模式——工厂模式学习笔记
本文参考文献:GeekBand课堂内容,授课老师:李建忠 :大话设计模式 其余的模式方法请自行查看Geekband相关课程,在此不累述. 这周的课题是: 针对DrawingSystem中的基类Sha ...
- Ruby设计模式-观察者模式学习笔记
observer.rb #!/bin/env ruby # encoding: utf-8 require 'observer' class CriminalMovement include Obse ...
- c#观察者模式学习笔记(1)
c#中的观察者是一种逻辑上很重要的角色,在服务端,观察者是服务端的通讯员,它将事件与业务紧密的结合,彼此又能按照逻辑进行分离. 实现方法为: (1)声明事件的委托原型,作为事件订阅的回调. (2)使用 ...
- 《Head.First设计模式》的学习笔记(9)--外观模式
意图:为子系统中的一组接口提供一个一致的界面,Facade 模式定义了一个高层接口,这个接口使得这一子系统更加容易使用. 结构: 例子: 假设你有一套杀手级的家庭影院系统,内含DVD播放器.投影仪.自 ...
- .NET CORE学习笔记系列(2)——依赖注入【2】基于IoC的设计模式
原文:https://www.cnblogs.com/artech/p/net-core-di-02.html 正如我们在<控制反转>提到过的,很多人将IoC理解为一种“面向对象的设计模式 ...
- 设计模式学习笔记——java中常用的设计模式
单例设计模式(Singleton Pattern) 观察者模式(Observer Pattern) 工厂模式(Factory Pattern) 策略模式(Strategy Pattern) 适配器模式 ...
- 7 种 Javascript 常用设计模式学习笔记
7 种 Javascript 常用设计模式学习笔记 由于 JS 或者前端的场景限制,并不是 23 种设计模式都常用. 有的是没有使用场景,有的模式使用场景非常少,所以只是列举 7 个常见的模式 本文的 ...
- 【Head-First设计模式】C#版-学习笔记-开篇及文章目录
原文地址:[Head-First设计模式]C#版-学习笔记-开篇及文章目录 最近一年断断续续的在看技术书,但是回想看的内容,就忘了书上讲的是什么东西了,为了记住那些看过的东西,最好的办法就是敲代码验证 ...
- [学习笔记]设计模式之Abstract Factory
写在前面 为方便读者,本文已添加至索引: 设计模式 学习笔记索引 在上篇笔记Builder设计模式中,时の魔导士祭出了自己的WorldCreator.尽管它因此能创造出一个有山有树有房子的世界,但是白 ...
随机推荐
- 【组件】微信小程序input搜索框的实现
开发小程序的过程,是一个学习知识,解决问题的过程,每当实现了一个需求,总会有很大的成就感,每天记录一个开发过程中的细节.实现效果如下: 官方参考链接:https://developers.weixin ...
- c#中反射的用法(即如何根据字符找到已定义的变量)
2013-07-20 08:06 720人阅读 评论(0) 收藏 举报 分类: C#(9) 作者同类文章 X 版权声明:本文为博主原创文章,未经博主允许不得转载. 常常羡慕javascript中, ...
- 洛谷 P1808 单词分类_NOI导刊2011提高(01)
P1808 单词分类_NOI导刊2011提高(01) 题目描述 Oliver为了学好英语决定苦背单词,但很快他发现要直接记住杂乱无章的单词非常困难,他决定对单词进行分类. 两个单词可以分为一类当且仅当 ...
- SQLite基础学习
SQLite是一款轻量级数据库,集成于android中,以下从分享一下自己学习的. 在查阅资料时有一些好的说明就直接用了: 主要的curd语句 以下SQL语句获取5条记录,跳过前面3条记录 selec ...
- 自己定义progressdialog载入动画,这里还有旋转的载入条,美团,多个图片动画
自己定义progressdialog载入动画,这里还有旋转的载入条,美团,多个图片动画 下载Demo:http://download.csdn.net/detail/menglele1314/8775 ...
- js进阶 13-6 jquery动画效果相关常用函数有哪些
js进阶 13-6 jquery动画效果相关常用函数有哪些 一.总结 一句话总结:animate(),stop(),finish(),delat()四个. 1.stop()方法的基本用法是什么(sto ...
- JS数据类型的转换规则
数据类型转换的规则 1 如果只有一个值,判断这个值是真还是假,遵循只有0,NaN,'',null,undefined这五个是假的,其余的都是真 2 如果是两个值比较是否相等,遵循以下规则: ![]-& ...
- UML学习总结(3)——StarUML指导手册
StarUML使用说明-指导手册 原著:Stephen Wong 翻译:火猴 StarUML是一种生成类图和其他类型的统一建模语言(UML)图表的工具.这是一个用Java语言描述 ...
- vim编辑器经常使用命令
高级一些的编辑器,都会包括宏功能,vim当然不能缺少了.在vim中使用宏是很方便的: :qx 開始记录宏,并将结果存入寄存器xq 退出记录模式@x 播放记录在x寄存器中的宏命令 ...
- 每日技术总结:jquery datetimepicker,微博QQ好友QQ空间微信等分享接口
前言: 1.jquery datetimepicker 今天遇到一个日期控件格式的问题,默认选中显示的并不是设定的值,而是当天的日期.于是去查了一遍文档. 参考文章:jquery datetimepi ...