Skip to main content

moregeek program

观察者模式C++实现-多极客编程

观察者模式



如果你能理解委托,那么观察者模式对你来说很简单。委托,就是在一个类A里包含另一个类B的对象的指针作为本类的数据成员。因此此类A就有了调用类B里函数成员的能力。观察者模式的本质就是托管。在代码中可以清楚看到这些。下面的案例中主体(相当类A)添加了list链表来存储多个来自观察者类(相当于类B)的对象实例的指针。



Exe : Observer.o
g++ -o Exe Observer.o
main.o : Observer.cpp
g++ -g -c Observer.cpp
clean :
rm Observer

#include <iostream>
#include <string>
#include <list>
using namespace std;

class Observer
{
public:
bool bool_state = false;
void change_state();
};
void Observer::change_state()
{
cout << "before change Observer state : " << bool_state << endl;
bool_state = bool_state ? false : true;
cout << "after change Observer state : " << bool_state << endl;
}

class Object
{
public:
list<Observer*> Observer_list;
bool bool_state = false;
void add_list(Observer* ptr);
void delete_list(Observer* ptr);
void notice();
void change_state();
};

void Object::add_list(Observer* ptr)
{
Observer_list.push_back(ptr);
}

void Object::delete_list(Observer* ptr)
{
Observer_list.remove(ptr);
}

void Object::notice()
{
for(list<Observer*>::iterator iter = Observer_list.begin(); iter != Observer_list.end(); iter++)
{
(*iter)->change_state();
}
}
void Object::change_state()
{
cout << "before change Object state : " << bool_state << endl;
bool_state = bool_state ? false : true;
cout << "after change Object state : " << bool_state << endl;

notice();
}

int main(void)
{
Observer* p_Observer = new Observer;
Observer* p_Observer_2 = new Observer;
Object* p_Object = new Object;
p_Object->add_list(p_Observer);
p_Object->add_list(p_Observer_2);
p_Object->change_state();

delete p_Object;
delete p_Observer;
delete p_Observer_2;
return 0;
}

©著作权归作者所有:来自51CTO博客作者潇湘二胡的原创作品,如需转载,请注明出处,否则将追究法律责任
观察者模式C++实现
https://blog.51cto.com/u_14338379/4661387

Java中那些让你爱不释手工具库,精炼代码量-多极客编程

Java中那些让你爱不释手工具库,精炼代码量 一、JDK1.8 Stream新特性 1、Stream流的常见生成方式 ①Collection体系的集合可以使用默认方法stream()生成流 //list转stream流 List<String> list = new ArrayList<>(); Stream<String> listStrea

vivo统一告警平台设计与实践-多极客编程

一、背景 一套监控系统检测和告警是密不可分的,检测用来发现异常,告警用来将问题信息发送给相应的人。vivo监控系统1.0时代各个监控系统分别维护一套计算、存储、检测、告警收敛逻辑,这种架构下对底层数据融合非常不利,也就无法实现监控系统更广泛场景的应用,所以需要进行整体规划,重新对整个监控系统架构进行调整,在这样的背景下统一监控的目标被确立。 以前监控被划分为基础监控、通用监控、调用链、日志监控、拨

flea-frame-cache使用之Redis分片模式接入-多极客编程

Redis分片模式接入 1. 参考 flea-frame-cache使用之Redis分片模式接入 源代码v1.1.0 2. 依赖 jedis-3.0.1.jar <!-- Java redis --> <dependency> <groupId>redis.clients</groupId> <artifactId>j

深入理解 WKWebView(入门篇)—— WebKit 源码调试与分析-多极客编程

一、前言 移动互联网时代,网页依旧是内容展示的重要媒介,这离不开 WebKit 浏览内核技术的支持与发展。在 iOS 平台下开发者们需要通过 WKWebView 框架来与 WebKit 打交道。虽然苹果官方提供了关于 WKWebView 的 API 与使用说明,但这并不能满足开发者们的需求,各类复杂场景依旧让我们焦头烂额,而解决方案却不易寻找。此时,优秀的开发者们将目光移向苹果开源的 WebKi

初次见面,能否把你的「注册表」都给我?#yyds干货盘点#-多极客编程

大家好,我是悟空。 一、前言 注册表对于注册中心尤为重要,所有的功能都是围绕这个注册表展开。比如服务 A 要想访问服务 B,就得知道服务 B 的 IP 地址和端口号吧。如下图所示,传统的方式就是服务 A 知道了服务 B 的地址后,发送 HTTP 请求到对应的 API 地址上。 那服务 A 和 服务 B 的信息其实就是放在注册中心的注册表里面的,由注册中心统一管理所有服务的注册、下线。服务 A 和

11 图 | 硬核讲解 Eureka 增量同步的原理 #yyds干货盘点#-多极客编程

大家好,我是悟空。 先说下哈,这篇文章画原理图用了很多时间,求个三连! Eureka 注册中心系列文章已经写到第六篇了,这里汇总下: 领导让我研究 Eureka 源码 | 启动过程 领导“叕”让我研究 Eureka 源码:注册过程 值得收藏的 Eureka 控制台详解 原来一个 Map 就能搞定注册表了 6 张图 | 剖析客户端首次同步注册表 一、前言 上一篇我们讲解了客户端首次获取注册表时,需

Java中那些让你爱不释手工具库,精炼代码量-多极客编程

Java中那些让你爱不释手工具库,精炼代码量 一、JDK1.8 Stream新特性 1、Stream流的常见生成方式 ①Collection体系的集合可以使用默认方法stream()生成流 //list转stream流 List<String> list = new ArrayList<>(); Stream<String> listStrea

#yyds干货盘点# 性能问题分析策略(二)-多极客编程

磁盘分类分析策略第二部分,我们需要理解IO问题在性能问题中的重要部分。磁盘I/O可能会造成应用程序有延时,所以说IO问题分析是系统性能分析的一个重要目标。在高负荷下,磁盘成为了一个性能瓶颈。关于磁盘的分类,可能大家都比较熟悉,如下图所示:通常来说固态硬盘的出现或者说闪存技术的出现和发展是为了提供IO的效率和性能,但是我们知道,现代系统对于IO的关于性能方面的需求可能超过了现有的能力,所以性能问题还

vivo统一告警平台设计与实践-多极客编程

一、背景 一套监控系统检测和告警是密不可分的,检测用来发现异常,告警用来将问题信息发送给相应的人。vivo监控系统1.0时代各个监控系统分别维护一套计算、存储、检测、告警收敛逻辑,这种架构下对底层数据融合非常不利,也就无法实现监控系统更广泛场景的应用,所以需要进行整体规划,重新对整个监控系统架构进行调整,在这样的背景下统一监控的目标被确立。 以前监控被划分为基础监控、通用监控、调用链、日志监控、拨

深入理解 WKWebView(入门篇)—— WebKit 源码调试与分析-多极客编程

一、前言 移动互联网时代,网页依旧是内容展示的重要媒介,这离不开 WebKit 浏览内核技术的支持与发展。在 iOS 平台下开发者们需要通过 WKWebView 框架来与 WebKit 打交道。虽然苹果官方提供了关于 WKWebView 的 API 与使用说明,但这并不能满足开发者们的需求,各类复杂场景依旧让我们焦头烂额,而解决方案却不易寻找。此时,优秀的开发者们将目光移向苹果开源的 WebKi

初次见面,能否把你的「注册表」都给我?#yyds干货盘点#-多极客编程

大家好,我是悟空。 一、前言 注册表对于注册中心尤为重要,所有的功能都是围绕这个注册表展开。比如服务 A 要想访问服务 B,就得知道服务 B 的 IP 地址和端口号吧。如下图所示,传统的方式就是服务 A 知道了服务 B 的地址后,发送 HTTP 请求到对应的 API 地址上。 那服务 A 和 服务 B 的信息其实就是放在注册中心的注册表里面的,由注册中心统一管理所有服务的注册、下线。服务 A 和

#yyds干货盘点# 常用软件框架,总有一个用的上-多极客编程

一、Fluent Ribbon界面框架Fluent/Ribbon是微软在其最新桌面操作系统Windows 7中使用的图形用户界面。 Windows平台的进化,伴随着系统图形界面的重新设计。从Windows XP到Windows Vista,最大的革新就是Windows Aero的引入。在Windows 7 中,Aero被保留下来。 但是,在未来,Windows 7的图形用户界面将朝着Office