本文参考文献::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] 设计模式之观察者模式学习笔记的更多相关文章

  1. [GeekBand] 设计模式——工厂模式学习笔记

     本文参考文献:GeekBand课堂内容,授课老师:李建忠 :大话设计模式 其余的模式方法请自行查看Geekband相关课程,在此不累述. 这周的课题是: 针对DrawingSystem中的基类Sha ...

  2. Ruby设计模式-观察者模式学习笔记

    observer.rb #!/bin/env ruby # encoding: utf-8 require 'observer' class CriminalMovement include Obse ...

  3. c#观察者模式学习笔记(1)

    c#中的观察者是一种逻辑上很重要的角色,在服务端,观察者是服务端的通讯员,它将事件与业务紧密的结合,彼此又能按照逻辑进行分离. 实现方法为: (1)声明事件的委托原型,作为事件订阅的回调. (2)使用 ...

  4. 《Head.First设计模式》的学习笔记(9)--外观模式

    意图:为子系统中的一组接口提供一个一致的界面,Facade 模式定义了一个高层接口,这个接口使得这一子系统更加容易使用. 结构: 例子: 假设你有一套杀手级的家庭影院系统,内含DVD播放器.投影仪.自 ...

  5. .NET CORE学习笔记系列(2)——依赖注入【2】基于IoC的设计模式

    原文:https://www.cnblogs.com/artech/p/net-core-di-02.html 正如我们在<控制反转>提到过的,很多人将IoC理解为一种“面向对象的设计模式 ...

  6. 设计模式学习笔记——java中常用的设计模式

    单例设计模式(Singleton Pattern) 观察者模式(Observer Pattern) 工厂模式(Factory Pattern) 策略模式(Strategy Pattern) 适配器模式 ...

  7. 7 种 Javascript 常用设计模式学习笔记

    7 种 Javascript 常用设计模式学习笔记 由于 JS 或者前端的场景限制,并不是 23 种设计模式都常用. 有的是没有使用场景,有的模式使用场景非常少,所以只是列举 7 个常见的模式 本文的 ...

  8. 【Head-First设计模式】C#版-学习笔记-开篇及文章目录

    原文地址:[Head-First设计模式]C#版-学习笔记-开篇及文章目录 最近一年断断续续的在看技术书,但是回想看的内容,就忘了书上讲的是什么东西了,为了记住那些看过的东西,最好的办法就是敲代码验证 ...

  9. [学习笔记]设计模式之Abstract Factory

    写在前面 为方便读者,本文已添加至索引: 设计模式 学习笔记索引 在上篇笔记Builder设计模式中,时の魔导士祭出了自己的WorldCreator.尽管它因此能创造出一个有山有树有房子的世界,但是白 ...

随机推荐

  1. 在线java反编译服务

    大家是否遇到过有java class文件,却没有java源码的苦恼.近期findmaven.net提供了在线java反编译服务http://www.findmaven.net/decompile_cn ...

  2. POJ 3468 A Simple Problem with Integers 线段树区间修改

    http://poj.org/problem?id=3468 题目大意: 给你N个数还有Q组操作(1 ≤ N,Q ≤ 100000) 操作分为两种,Q A B 表示输出[A,B]的和   C A B ...

  3. jmeter--九种定时器介绍(包括思考时间、集合点)

    知识来源:http://www.cnblogs.com/imyalost/p/6004678.html jmeter提供了很多元件,帮助我们更好的完成各种场景的性能测试,其中,定时器(timer)是很 ...

  4. [D3] Build a Column Chart with D3 v4

    Column and bar charts are staples of every visualization library. They also make a great project for ...

  5. 数据结构-堆实现优先队列(java)

    队列的特点是先进先出.通常都把队列比喻成排队买东西,大家都非常守秩序,先排队的人就先买东西. 可是优先队列有所不同,它不遵循先进先出的规则,而是依据队列中元素的优先权,优先权最大的先被取出. 这就非常 ...

  6. OAuth2 社区通用组件

    转载:http://www.cyqdata.com/download/article-detail-54302   使用本组件,只需要几行代码,就可以在网站上集成以下效果:     相关文章及使用说明 ...

  7. 【例题 6-7 UVA - 122 】Trees on the level

    [链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 二叉树的话,直接用数组存就好了. 写个bfs记录一下答案. [代码] #include <bits/stdc++.h> ...

  8. C/C++ 程序的跟踪和分析工具 uftrace

    uftrace 用于跟踪和分析 C/C++ 编写的程序的执行情况,它受到 Linux 内核的 ftrace 框架的启发(特别是 function graph tracer),支持 userspace ...

  9. [机器学习] Coursera ML笔记 - 逻辑回归(Logistic Regression)

    引言 机器学习栏目记录我在学习Machine Learning过程的一些心得笔记,涵盖线性回归.逻辑回归.Softmax回归.神经网络和SVM等等.主要学习资料来自Standford Andrew N ...

  10. ps树叶的雕刻

    1.学习了图层建立,通道复制,通道载如.图层复制粘贴透明,色阶改动(ctrl+L),蒙板建立(必须不在背景上),蒙板刻图.蒙板画画(白色,黑色),蒙板填充(ctrl+backspace),(atrl+ ...