您的位置:首页 > 编程语言 > C语言/C++

设计模式 - 观察者模式(Observe pattern)C++实现

2016-04-23 02:03 661 查看
通用的设计模式比较多,大约十多种,其实之前也看多很多次,大致的理解就是利用继承,多态,封装,来达到代码的高重用性,以及系统可靠性可维护性。

这篇博客主要记录一下我复习的观察者模式,利用C++实现的。

观察者模式

首先介绍一下什么是观察者模式:

观察者模式(有时又被称为发布(publish )-订阅(Subscribe)模式、模型-视图(View)模式、源-收听者(Listener)模式或从属者模式)是软件设计模式的一种。在此种模式中,一个目标物件管理所有相依于它的观察者物件,并且在它本身的状态改变时主动发出通知。这通常透过呼叫各观察者所提供的方法来实现。此种模式通常被用来实现事件处理系统。(from 百度百科)

好~ 这里说完了,然后发现没懂~ 用通俗一点的话来解释一下。

这个模式一共两个类型的角色,观察者(Observe)与被观察者(Subject)

这个模式观察者可以有多个,被观察者只有一个。所以解决的问题是一对多的实体关系。

实现的目的是让在被观察者变动的时候,自动通知所有观察者进行更新操作。

类图示意



上图是Java的示意图!凑合着看吧~ 自己不想画了,只有四个类,其中两个接口,两个实现。

代码实现

下面放上我写的代码实现。

//
//  main.cpp
//  MS_exam1
//
//  Created by Alps on 16/4/12.
//  Copyright © 2016年 chen. All rights reserved.
//

#include <iostream>
#include <vector>
#include <queue>
using namespace std;

class Observe{//观察者
public:
virtual void update(std::string message) = 0;
};

class Subject{//被观察者
public:
virtual void addObserve(Observe* observe)= 0;
virtual void rmObserve(Observe* Observe)= 0;
virtual void notifyAll()= 0;
virtual void setMessage(std::string message)= 0;
virtual void messageChanged()= 0;
};

class ExamObserve : public Observe{
private:
std::string message;
std::string name;
Subject * subject;
public:
ExamObserve(Subject *subject, std::string name){
this->name = name;
this->subject = subject;
}
void update(std::string message){
this->message = message;
this->displayMessage();
}

void displayMessage(){
std::cout<<"Person "<<name<<" say "<<this->message<<std::endl;
}
};

class ExampleSubject : public Subject{
private:
std::vector<Observe *> list;
std::string message;
public:
void addObserve(Observe *observe){
list.push_back(observe);//注册观察者
}

void rmObserve(Observe * observe){//移除
std::vector<Observe *>::iterator iter;
if ((iter = std::find(list.begin(), list.end(), observe)) != list.end()) {
list.erase(iter);
}
}

void notifyAll(){//通知所有观察者
for (int i = 0; i < list.size(); i++) {
list[i]->update(message);
}
}

void setMessage(std::string message){//信息更改
this->message = message;
messageChanged();
}

void messageChanged(){
notifyAll();
}
};

int main(int argc, const char * argv[]) {
Subject *subject = new ExampleSubject();
subject->addObserve(new ExamObserve(subject, "chen"));
subject->addObserve(new ExamObserve(subject, "fu"));
subject->addObserve(new ExamObserve(subject, "shan"));
//或者实现多个Observe类来作为不同的输出
subject->setMessage("happy birthday to you!");
subject->setMessage("Sorry, I love you!");
subject->setMessage("Sorry, I don't love you");

return 0;
}


以上就是观察者模式的实现代码了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  设计模式