通用的设计模式比较多,大约十多种,其实之前也看多很多次,大致的理解就是利用继承,多态,封装,来达到代码的高重用性,以及系统可靠性可维护性。
这篇博客主要记录一下我复习的观察者模式,利用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;
}
以上就是观察者模式的实现代码了。