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

用代码和UML图化解设计模式之《观察者模式》

2012-11-02 14:31 579 查看
 

观察者模式应该说比较简单,就是将不同观察者注册到被观察者内部,被观察者做了什么动作,都会通知到被观察者。。。

 

代码中,被观察者也可以形成接口,有不同的子类,被观察,更灵活一些。。。

 

下面代码

 

// Observer.cpp : 定义控制台应用程序的入口点。
//************************************************************************/
/* @filename    Observer.cpp
@author       wallwind
@createtime    2012/11/2 23:58
@function     观察者模式
@email       wochenglin@qq.com
@weibo      @成林有理想
*/
/************************************************************************/

#include "stdafx.h"
#include <iostream>
#include <vector>

using namespace std;
/*
观察者
*/
class IObserver
{
public:
IObserver(){}
virtual ~IObserver(){}
virtual void update() = 0;
};

/*
观察者1;
*/

class FirstObserver :public IObserver
{
public:
FirstObserver(){}
virtual ~FirstObserver(){}

virtual void update()
{
cout<<"FirstObserver KNOW  OBSERVERABLE DO ACTION" <<endl;

}
};

class SecondObserver :public IObserver
{
public:
SecondObserver(){}
virtual ~SecondObserver(){}

virtual void update()
{
cout<<"SecondObserver KNOW  OBSERVERABLE DO ACTION" <<endl;
}

};
/**
被观察者
*/
class Observable
{
public:
Observable()
{

}
~Observable()
{

}

void addObser(IObserver* obser)
{
m_obserSet.push_back(obser);
}

void removeObser(IObserver* obser)
{
m_obserSet.pop_back();
}

void doAction()
{
cout<<"Observable do some action " <<endl;

this->notifyAllObser();
}

void notifyAllObser()
{
vector< IObserver* > ::iterator iter = m_obserSet.begin();
for (;iter !=m_obserSet.end();iter++)
{
(*iter)->update();
}
}

private:
vector< IObserver* > m_obserSet;
};

int _tmain(int argc, _TCHAR* argv[])
{

IObserver * fober = new FirstObserver();
IObserver * sober = new SecondObserver();

Observable * oble = new Observable;
oble->addObser(fober);
oble->addObser(sober);

oble->doAction();

return 0;
}


在类设计上可以更加灵活。

 

更多文章,欢迎访问:http://blog.csdn.net/wallwind
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: