设计模式 - 观察者模式(Observe pattern)C++实现
2016-04-23 02:03
661 查看
通用的设计模式比较多,大约十多种,其实之前也看多很多次,大致的理解就是利用继承,多态,封装,来达到代码的高重用性,以及系统可靠性可维护性。
这篇博客主要记录一下我复习的观察者模式,利用C++实现的。
观察者模式(有时又被称为发布(publish )-订阅(Subscribe)模式、模型-视图(View)模式、源-收听者(Listener)模式或从属者模式)是软件设计模式的一种。在此种模式中,一个目标物件管理所有相依于它的观察者物件,并且在它本身的状态改变时主动发出通知。这通常透过呼叫各观察者所提供的方法来实现。此种模式通常被用来实现事件处理系统。(from 百度百科)
好~ 这里说完了,然后发现没懂~ 用通俗一点的话来解释一下。
这个模式一共两个类型的角色,观察者(Observe)与被观察者(Subject)
这个模式观察者可以有多个,被观察者只有一个。所以解决的问题是一对多的实体关系。
实现的目的是让在被观察者变动的时候,自动通知所有观察者进行更新操作。
上图是Java的示意图!凑合着看吧~ 自己不想画了,只有四个类,其中两个接口,两个实现。
以上就是观察者模式的实现代码了。
这篇博客主要记录一下我复习的观察者模式,利用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; }
以上就是观察者模式的实现代码了。
相关文章推荐
- PropertyChangeListener简单理解
- 什么是设计模式
- 设计模式之创建型模式 - 特别的变量问题
- 七、设计模式——装饰模式
- 设计模式总结
- 设计模式之创建型模式
- 浅谈设计模式的学习
- Ruby设计模式编程之适配器模式实战攻略
- 实例讲解Ruby使用设计模式中的装饰器模式的方法
- 设计模式中的模板方法模式在Ruby中的应用实例两则
- Ruby设计模式编程中对外观模式的应用实例分析
- 实例解析Ruby设计模式编程中Strategy策略模式的使用
- Ruby中使用设计模式中的简单工厂模式和工厂方法模式
- Ruby使用设计模式中的代理模式与装饰模式的代码实例
- 详解组合模式的结构及其在Ruby设计模式编程中的运用
- C#编程中使用设计模式中的原型模式的实例讲解
- 使用设计模式中的工厂方法模式进行C#编程的示例讲解
- 实例解析C#设计模式编程中简单工厂模式的使用
- 详解C#设计模式编程中生成器模式的使用
- 深入解析C#设计模式编程中对建造者模式的运用