大话设计模式--观察者模式 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(对象行为型)
一.观察者模式 观察者模式是在对象之间定义一对多的依赖,这样一来,当一个对象改变状态,依赖它的对象都会收到通知,并自动更新.观察者模式也被称之为:主题-观察者模式,发布-订阅模式,前者是一,后者是多. ...
随机推荐
- 如何突破PHP程序员的技术瓶颈分析
来自:http://www.jb51.net/article/27740.htm 身边有几个做PHP开发的朋友,也接触到不少的PHP工程师,他们常疑虑自己将来在技术上的成长与发展,我常给他们一些建议, ...
- Hbase和RDBMS(关系数据库管理系统)区别
hbase是一个基于列模式的映射数据库,键--->数据 的映射,大大简化了传统数据 数据类型:hbase的存储的数据都是字符串,所有的类型都有用户自己处理,他只保存字符串;传统的数据有丰富的 ...
- java 接口实现多态
package unit4; import java.awt.Graphics; public interface Shape { void drowme(Graphics g); double ar ...
- ifconfig 命令
许多windows非常熟悉ipconfig命令行工具,它被用来获取网络接口配置信息并对此进行修改.Linux系统拥有一个类似的工具,也就是ifconfig(interfaces config).通常需 ...
- 【cocos2dx 3.3】口袋空战5 总结与公布
打包好的APK:点击下载
- Unity框架入门
介绍Unity框架之前,先要说几个概念DIP依赖倒置原则.IOC控制反转.DI依赖注入 DIP是设计原则之一,定义:上层不应该依赖于底层,两者都依赖于抽象: 抽象不依赖于细节,细节应该依赖于抽象. 像 ...
- Jmeter 02 JMeter体系结构
1. Jmeter简介 2. Jmeter体系结构 3. Jmeter运行原理 4. Jmeter测试计划要素 5. Jmeter环境介绍 6. Jmeter与Loadrunner异同
- eclipse 创建maven web 项目
虽然网上教程一大把,但也重新整理下. 一.创建项目 1.Eclipse中用Maven创建项目 上图中Next 2.继续Next 3.选maven-archetype-webapp后,next 4.填写 ...
- poj2421
Constructing Roads Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 22048 Accepted: 93 ...
- go语言之并发编程 channel
前面介绍了goroutine的用法,如果有多个goroutine的话相互之间是如何传递数据和通信的呢.在C语言或者JAVA中,传输的方法包括共享内存,管道,信号.而在Go语言中,有了更方便的方法,就是 ...