大话设计模式--观察者模式 Observer -- C++ 实现实例
大话设计模式--1.观察者模式: 定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象,这个主题对象在状态发生变化时,会通知所有的
观察者对象,使他们能够自动更新自己。
使用场合:
当一个对象的改变需要同时改变其他对象时,而且它不知道具体有多少对象有待改变。
当一个抽象模型有两个方面,其中一个方面依赖另一个方面,这时观察者模式可以使这两者封装在独立的对象中使它们各自独立地改变和复用。
缺点: 抽象通知者 还是依赖于 抽象观察者,并不是一定能抽象出观察者这样的接口,并且每个具体的观察者并不一定是以update的方法调用,
依靠委托解决以上问题。
实例:
subject.h subject.cpp 通知者抽象
#ifndef SUBJECT_H
#define SUBJECT_H #include "Observer.h"
#include <list>
using namespace std; class Subject
{
public:
Subject();
void virtual addObserver(Observer *observer);
void virtual delObserver(Observer *observer);
void virtual notify(); private:
list<Observer*> *observer;
}; #endif // SUBJECT_H
#include "subject.h" Subject::Subject()
{
observer = new list<Observer*>();
} void Subject::addObserver(Observer* observer)
{
this->observer->push_back(observer);
} void Subject::delObserver(Observer* observer)
{ } void Subject::notify()
{
Observer *ob;
list<Observer*>::iterator i;
for(i=observer->begin(); i!=observer->end(); i++)
{
ob = *i;
ob->update(); }
}
concretesubject.h concretesubject.cpp 通知者实例
#ifndef CONCRETESUBJECT_H
#define CONCRETESUBJECT_H #include "subject.h"
#include <string>
using namespace std; class concreteSubject : public Subject
{
public:
concreteSubject();
void setSubjectState(string state);
string getSubjectState(); private:
string subjectState;
}; #endif // CONCRETESUBJECT_H
#include "concretesubject.h" concreteSubject::concreteSubject()
{
} void concreteSubject::setSubjectState(string state)
{
subjectState = state;
} string concreteSubject::getSubjectState()
{
return subjectState;
}
observer.h observer.cpp 观察者抽象
#ifndef OBSERVER_H
#define OBSERVER_H class Observer
{
public:
Observer();
void virtual update();
}; #endif // OBSERVER_H
#include "observer.h" Observer::Observer()
{
} void Observer::update()
{ }
concreteobserver1.h concreteobserver1.cpp 观察者实例
#ifndef CONCRETEOBSERVER1_H
#define CONCRETEOBSERVER1_H #include "observer.h"
#include "concretesubject.h"
#include <string>
using namespace std; class ConcreteObserver1 : public Observer
{
public:
ConcreteObserver1(concreteSubject *subject, string name);
void update(); private:
string name;
string observerState;
concreteSubject* subject; }; #endif // CONCRETEOBSERVER1_H
#include "concreteobserver1.h"
#include <iostream>
using namespace std; ConcreteObserver1::ConcreteObserver1(concreteSubject *subject, string name)
{
this->subject = subject;
this->name = name;
observerState = subject->getSubjectState();
} void ConcreteObserver1::update()
{
observerState = subject->getSubjectState();
cout << "name: " << name << " ,state: " << observerState << endl;
}
main.cpp
#include <iostream>
#include "concreteobserver1.h"
#include "concretesubject.h"
using namespace std; int main()
{
cout << "Observer test !" << endl; concreteSubject s;
s.addObserver(new ConcreteObserver1(&s, "zhangsan"));
s.addObserver(new ConcreteObserver1(&s, "lisi"));
s.setSubjectState("boss comes back");
s.notify(); return 0;
}
大话设计模式--观察者模式 Observer -- C++ 实现实例的更多相关文章
- linkin大话设计模式--观察者模式
		
linkin大话设计模式--观察者模式 观察者模式定义了对象间的一对多依赖关系,让一个或者多个观察者观察一个对象主题.当主题对象的状态发生改变的时候,系统能通知所有的依赖于此对象的观察者对象,从而能自 ...
 - java设计模式--观察者模式(Observer)
		
java设计模式--观察者模式(Observer) java设计模式--观察者模式(Observer) 观察者模式的定义: 定义对象间的一种一对多的依赖关系.当一个对象的状态发生改变时,所有依赖于它的 ...
 - 设计模式-观察者模式(Observer Pattern)
		
观察者模式(Observer Pattern):定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象.这个主题对象在状态发生变化时,会通知所有观察者对象,使他们能够自动更新自己. 观察者 ...
 - 设计模式 - 观察者模式(Observer Pattern) 详细说明
		
观察者模式(Observer Pattern) 详细说明 本文地址: http://blog.csdn.net/caroline_wendy/article/details/26583157 版权全部 ...
 - 设计模式 - 观察者模式(Observer Pattern) 详细解释
		
观察者模式(Observer Pattern) 详细解释 本文地址: http://blog.csdn.net/caroline_wendy/article/details/26583157 版权全部 ...
 - 设计模式 - 观察者模式(Observer Pattern) Java内置 用法
		
观察者模式(Observer Pattern) Java内置 用法 本文地址: http://blog.csdn.net/caroline_wendy/article/details/26601659 ...
 - [工作中的设计模式]观察者模式observer
		
一.模式解析 观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象.这个主题对象在状态上发生变化时,会通知所有观察者对象,使它们能够自动更新自己. 观察者模式又叫订阅发布模式, ...
 - 设计模式-观察者模式(Observer)
		
简介: 观察者模式,也称为订阅-发布模式,定义对象间的一种一对多的依赖关系,当一个对象的状态发生变化时,所有依赖他的对象都得到通知并被自动更新. 主要由以下几个部分组成: a.Subject目标对象. ...
 - 设计模式--观察者模式Observer(对象行为型)
		
一.观察者模式 观察者模式是在对象之间定义一对多的依赖,这样一来,当一个对象改变状态,依赖它的对象都会收到通知,并自动更新.观察者模式也被称之为:主题-观察者模式,发布-订阅模式,前者是一,后者是多. ...
 
随机推荐
- nodejs 学习资料大全
			
1.blog学习篇 http://blog.fens.me/series-nodejs/ 从零开始nodejs系列文章
 - React 学习推荐
			
推荐学习一.React 入门实例教程 作者: 阮一峰 http://www.ruanyifeng.com/blog/2015/03/react.html 瘳雪峰的Javascript教程 ht ...
 - centos7 改变终端背景色
			
首先打开终端 2:选择 edit->preferences->profile 3: "model1"是我自己改的名字,最开始是"unname".双击 ...
 - swift - 实现类似今日头条顶部标签和底部内容的动态解决方案
			
TYPageView TYPageView 类似今日头条 的标签导航解决方案,支持多种样式选择,基于swift3.0,支持文字颜色动态变化,底部选中线的动态变化 配图: 使用方法: let title ...
 - ubuntu 16.04中卸载软件。
			
今天装了个QQ,结果不会用,折腾了半天终于卸载掉了. dpkg -l | grep qq(查出安装的软件) 使用 sudo dpkg --purge xxx(这里xxx写查出来的软件包名字)
 - 从零开始学android -- notification通知
			
目前有三种通知 第一种是普通通知 看看效果 布局什么的太简单了我就不放在上面了给你们看核心的代码就行了 里面的 int notificationID = 1; //设置点击通知后的意图 Inten ...
 - python入门课程 第3章 Python变量和数据类型
			
第3章 Python变量和数据类型3-1 Python中数据类型计算机顾名思义就是可以做数学计算的机器,因此,计算机程序理所当然地可以处理各种数值.但是,计算机能处理的远不止数值,还可以处理文本.图形 ...
 - hdu 5969 最大的位或
			
最大的位或 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total Submi ...
 - bilingual evaluation understudy
			
BLEU is designed to approximate human judgement at a corpus level, and performs badly if used to eva ...
 - 我的Java开发学习之旅------>Java 格式化类(java.util.Formatter)基本用法
			
本文参考: http://docs.oracle.com/javase/1.5.0/docs/api/java/util/Formatter.html http://www.blogjava.net/ ...