大话设计模式--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++ 实现实例的更多相关文章

  1. linkin大话设计模式--观察者模式

    linkin大话设计模式--观察者模式 观察者模式定义了对象间的一对多依赖关系,让一个或者多个观察者观察一个对象主题.当主题对象的状态发生改变的时候,系统能通知所有的依赖于此对象的观察者对象,从而能自 ...

  2. java设计模式--观察者模式(Observer)

    java设计模式--观察者模式(Observer) java设计模式--观察者模式(Observer) 观察者模式的定义: 定义对象间的一种一对多的依赖关系.当一个对象的状态发生改变时,所有依赖于它的 ...

  3. 设计模式-观察者模式(Observer Pattern)

    观察者模式(Observer Pattern):定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象.这个主题对象在状态发生变化时,会通知所有观察者对象,使他们能够自动更新自己. 观察者 ...

  4. 设计模式 - 观察者模式(Observer Pattern) 详细说明

    观察者模式(Observer Pattern) 详细说明 本文地址: http://blog.csdn.net/caroline_wendy/article/details/26583157 版权全部 ...

  5. 设计模式 - 观察者模式(Observer Pattern) 详细解释

    观察者模式(Observer Pattern) 详细解释 本文地址: http://blog.csdn.net/caroline_wendy/article/details/26583157 版权全部 ...

  6. 设计模式 - 观察者模式(Observer Pattern) Java内置 用法

    观察者模式(Observer Pattern) Java内置 用法 本文地址: http://blog.csdn.net/caroline_wendy/article/details/26601659 ...

  7. [工作中的设计模式]观察者模式observer

    一.模式解析 观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象.这个主题对象在状态上发生变化时,会通知所有观察者对象,使它们能够自动更新自己. 观察者模式又叫订阅发布模式, ...

  8. 设计模式-观察者模式(Observer)

    简介: 观察者模式,也称为订阅-发布模式,定义对象间的一种一对多的依赖关系,当一个对象的状态发生变化时,所有依赖他的对象都得到通知并被自动更新. 主要由以下几个部分组成: a.Subject目标对象. ...

  9. 设计模式--观察者模式Observer(对象行为型)

    一.观察者模式 观察者模式是在对象之间定义一对多的依赖,这样一来,当一个对象改变状态,依赖它的对象都会收到通知,并自动更新.观察者模式也被称之为:主题-观察者模式,发布-订阅模式,前者是一,后者是多. ...

随机推荐

  1. linux kernel学习笔记-5内存管理_转

    void * kmalloc(size_t size, gfp_t gfp_mask); kmalloc()第一个参数是要分配的块的大小,第一个参数为分配标志,用于控制kmalloc()的行为. km ...

  2. Ionic项目打包安卓APK

    之前用Ionic+Angular做了几个小应用Demo,现在用其中一个做实验试下打包安卓的APK安装包.(备注:我用的应用demo是之前博客里写的汇率的Demo,不清楚的同学可以查哈~) 我是用ion ...

  3. 在Mac上为自己手动编译安装一套PHP7的开发环境

    首先你得去官网下载php7 beta1的版本 这里由于我是在mac上安装,所以就去下载linux相关的版本,地址也直接附上了php7 beta1windows版的官方也有发布详情猛戳:这里 解压安装包 ...

  4. object.Equals与object.ReferenceEquals方法

    object.Equals方法表达的是语义判等,不一定是引用判等. object.ReferenceEquals方法是肯定是引用判等. 怎么实现一个对象的值语义的 Equals方法?实验. MyCla ...

  5. web安全之SQL注入--第一章 课程介绍

    课程介绍1.什么是SQL注入?2.如何寻找SQL注入漏洞?3.如何进行sql注入攻击?4.如何预防sql注入5.课程总结

  6. js父页面和子页面之间传值

    今天和朋友一块讨论,怎样通过js在父页面和子页面之间传值的问题,总结例如以下: 需求描写叙述:父页面有多个子页面.实如今父页面点击子页面,传值到子页面. 看着非常easy,试了好久.主要纠结在怎样获取 ...

  7. DELL inspiron1420 linux下的wifi驱动安装

    首先确定无线网卡类型: lspci -vnn -d 14e4: 比如我的网卡类型为 04:00.0 Network controller [0280]:Broadcom Corporation BCM ...

  8. Apache启动失败(Windows 无法在本地计算机启动Apache2.2)

    该问题产生的原因有很多,这里就说说我遇到的问题: 这个问题是突然遇到的,启动的时候连日志都没有产生,最后是通过window的日志中发现问题所在的,如图所示: 发现是目录错了.其他问题也可以通过该日志找 ...

  9. iOS-事件传递和响应机制

    转自:http://www.jianshu.com/p/2e074db792ba 前言: 按照时间顺序,事件的生命周期是这样的: 事件的产生和传递(事件如何从父控件传递到子控件并寻找到最合适的view ...

  10. [Android]彻底去除Google AdMob广告

    应用中包含广告是能够理解的,但经常造成用户误点,或者广告切换时造成下载流量,就有点让人不舒服了. 以下就以Google AdMob广告为例,看怎样彻底去除他. 先分析一下Google AdMob的工作 ...