设计模式一:关于C++写观察者模式的一些收获
先贴上部分代码:
#include "stdafx.h"
#include<iostream>
#include<string>
#include<vector>
using namespace std;
class Observer;
class Subject;
class Subject
{
public:
Subject()
{
msg="orinal msg";
}
void add(Observer* ob)
{
vec.push_back(ob);
}
void show()
{
cout<<"broadcast:msg is:"<<msg<<endl;
}
void change(string msg)
{
this->msg=msg;
notification();
}
void notification()
{
vector<Observer*>::iterator v = vec.begin();
while( v != vec.end()) {
(*v)->Showdate();
v++;
}
} private:
vector<Observer*> vec;
string msg; };
class Observer
{
public:
Observer(Subject* sub)
{
this->sub=sub;
this->sub->add(this);
}
void Showdate()
{
sub->show();
}
private:
Subject* sub;
};
说明一下:这么写编译会报错的!
在 notification() 这一行报了错:
:错误 1 error C2027: 使用了未定义类型“Observer”
:错误 2 error C2227: “->Showdate”的左边必须指向类/结构/联合/泛型类型
我刚写的时候也是很疑问,为什么会这样呢,经过一番研究,原来编译过不去的原因是因为,在notification()函数里面调用了Observer类里的方法showdate(),而这个方法的声明在notification()之后,所以编译器找不到.
需要注意的一点是:虽然已经在开头声明了class Observer; class Subject;这两个类,但是 也仅仅是声明了类,并不代表声明了类里的函数。由于函数声明的位置不同 编译器仍有找不到的可能。
所以可以这么解决:
#include "stdafx.h"
#include<iostream>
#include<string>
#include<vector>
using namespace std;
class Observer;
class Subject;
class Subject
{
public:
Subject()
{
msg="orinal msg";
}
void add(Observer* ob)
{
vec.push_back(ob);
}
void show()
{
cout<<"broadcast:msg is:"<<msg<<endl;
}
void change(string msg)
{
this->msg=msg;
notification();
}
void notification();
private:
vector<Observer*> vec;
string msg; };
class Observer
{
public:
Observer(Subject* sub)
{
this->sub=sub;
this->sub->add(this);
}
void Showdate()
{
sub->show();
}
private:
Subject* sub;
};
void Subject::notification()
{
vector<Observer*>::iterator v = vec.begin();
while( v != vec.end()) {
(*v)->Showdate();
v++;
}
}
可以看到,把notification这个方法声明到最后就可以了。
通过写这个观察者模式,我有些收获:
C++毕竟与JAVA不同,在JAVA里不会存在这些问题(不得不说JAVA在类和对象这个方面有很多东西做的确实比C++强上不少)
所以写C++时先定义类 再声明函数,尽量不要在类内就把函数写好。写的时候一定要注意:先声明的函数是否调用了后声明的函数。
PS:说下C++的this指针,this指针可以理解为指向这个对象本身的指针。
附上主函数:
int _tmain(int argc, _TCHAR* argv[])
{
Subject* sub=new Subject();
Observer* ob1=new Observer(sub);
Observer* ob2=new Observer(sub);
Observer* ob3=new Observer(sub);
char opt;
while(true)
{
string tempmsg;
cout<<"please input a number"<<endl;
cin>>opt;
switch(opt)
{
case '1':
cout<<"please input the change msg"<<endl;
cin>>tempmsg;
sub->change(tempmsg);
break;
default:
break;
}
}
return ;
}
说下观察者模式的作用:
当对象间存在一对多关系时,则使用观察者模式(Observer Pattern)。比如,当一个对象被修改时,则会自动通知它的依赖对象:一个对象(目标对象)的状态发生改变,所有的依赖对象(观察者对象)都将得到通知,进行广播通知。
就拿我这个程序来说:可以把Subject看作一个水位监测,Observer看作显示水位状态的屏幕。 一旦监测(Subject)到水位发生变化 屏幕(Observer)立刻显示改变后的水位状态。
优点:
观察者和被观察者是一套触发机制:保证高度的协作;
缺点:
一个缺点:观察者模式没有相应的机制让观察者知道所观察的目标对象是怎么发生变化的,而仅仅只是知道观察目标发生了变化。
以上只是我的愚见,如果有些地方有误欢迎批评指正 oO(AIA)Oo
设计模式一:关于C++写观察者模式的一些收获的更多相关文章
- 设计模式之第18章-观察者模式(Java实现)
设计模式之第18章-观察者模式(Java实现) 话说曾小贤,也就是陈赫这些天有些火,那么这些明星最怕的,同样最喜欢的是什么呢?没错,就是狗仔队.英文的名字比较有意思,是paparazzo,这一说法据说 ...
- .NET设计模式(19):观察者模式(Observer Pattern)(转)
概述 在软件构建过程中,我们需要为某些对象建立一种“通知依赖关系” ——一个对象(目标对象)的状态发生改变,所有的依赖对象(观察者对象)都将得到通知.如果这样的依赖关系过于紧密,将使软件不能很好地抵御 ...
- 设计模式----行为型模式之观察者模式(Observer Pattern)
下面是阅读<Head First设计模式>的笔记. 观察者模式 定义了对象之间的一对多依赖,这样一来,当一个对象改变状态时,它的所有依赖者都会收到通知并自动更新. JDK API内置机制 ...
- IOS设计模式之三(适配器模式,观察者模式)
本文原文请见:http://www.raywenderlich.com/46988/ios-design-patterns. 由 @krq_tiger(http://weibo.com/xmuzyq) ...
- c++设计模式总结 好久没写博客了 实在是忙
具体代码就不贴出来了 通俗易懂的理解方式 原创 c++设计模式: 简单工厂模式 工厂模式有一种非常形象的描述,建立对象的类就如一个工厂,而需要被建立的对象就是一个个产品:在工厂中加工产品 ...
- C#设计模式学习笔记:(16)观察者模式
本笔记摘抄自:https://www.cnblogs.com/PatrickLiu/p/7928521.html,记录一下学习过程以备后续查用. 一.引言 今天我们要讲行为型设计模式的第四个模式--观 ...
- c++ 设计模式5 (Observer / Event 观察者模式)
3.3 观察者模式 (Observer)/发布-订阅模式 动机: 在软件构建过程中,我们需要为某些对象建立一种“通知依赖关系”——一个对象(目标对象)的状态发生改变,所有的依赖对象(观察者对象)都能得 ...
- 设计模式总结(Java)—— 观察者模式
概述 它用于建立一种对象与对象之间的依赖关系,一个对象发生改变时将自动通知其他对象,其他对象将相应作出反应.在观察者模式中,发生改变的对象称为观察目标,而被通知的对象称为观察者,一个观察目标可以对应多 ...
- java23种设计模式之: 策略模式,观察者模式
策略模式 --老司机开车,但是他今天想到路虎,明天想开奔驰...针对他不同的需求,来产生不同的应对策略 策略类是一个接口,定义了一个大概的方法,而实现具体的策略则是由实现类完成的,这样的目的是 ...
随机推荐
- java多线程基本概述(一)——线程的基本认知
1.1.概念: 进程:进程是操作系统结构的基础,是一次程序的执行:是一个程序及其数据再处理器上顺序执行时所发生的活动:是程序再一个数据集合上运行的过程,它是系统进行系统资源分配和调度的最小单元. 线程 ...
- 【2017-04-18】Ado.Net C#连接数据库进行增、删、改、查
一.简介 1.ado.net是一门数据库访问技术. 他可以通过程序来操作数据库 2.类库 Connection 类 和数据库交互,必须连接它.连接帮助指明数据库服务器.数据库名字.用户名.密码,和连接 ...
- Centos7完全分布式搭建Hadoop2.7.3
(一)软件准备 1,hadoop-2.7.3.tar.gz(包) 2,三台机器装有cetos7的机子 (二)安装步骤 1,给每台机子配相同的用户 进入root : su root ---------& ...
- 商城项目实战 | 2.1 Android 仿京东商城——自定义 Toolbar (一)
前言 本文为菜鸟窝作者刘婷的连载."商城项目实战"系列来聊聊仿"京东淘宝的购物商城"如何实现. 现在很多的 APP 里面都有自己的自定义风格,特别是京东商城中自 ...
- Apache Spark1.1.0部署与开发环境搭建
Spark是Apache公司推出的一种基于Hadoop Distributed File System(HDFS)的并行计算架构.与MapReduce不同,Spark并不局限于编写map和reduce ...
- spine动画融合与动画叠加
spine动画融合与动画叠加 一.动画融合setMix 1.概述:两个动作之间的平滑过渡 参数duration为需要多少时间从fromAnimation过渡到toAnimation,过渡时间为动画重叠 ...
- Java中的集合与线程的Demo
一.简单线程同步问题 package com.ietree.multithread.sync; import java.util.Vector; public class Tickets { publ ...
- IBM GPFS并行文件系统
原文地址:http://www.hqschina.com/Show.aspx?info_lb=283&info_id=751&flag=103 IBM GPFS文件系统是一种专门为群集 ...
- Android Material Design--TextInputLayout
TextInputLayout 1. 简介 官网开篇: Layout which wraps an EditText (or descendant) to show a floating label ...
- 【2017-05-02】winform弹出警告框是否进行增删改操作、记事本制作、对话框控件和输出输入流
一.winform弹出警告框是否进行增删改操作 第一个参数是弹出窗体显示的内容,第二个参数是标题,第三个参数是该弹窗包含确定和取消按钮. 返回的是一个枚举类接收一下. 再进行判断,如果点的是确定按钮, ...