码迷,mamicode.com
首页 > 其他好文 > 详细

Design Pattern - Observer 观察者设计模式

时间:2014-05-26 06:16:49      阅读:284      评论:0      收藏:0      [点我收藏+]

标签:des   class   blog   c   code   ext   

Spy on enemy.

使用这个模式可以根据某些事件自动更新。

设计思路:

1 设计一个基类,作为需要观察一个时间行为的接口类

2 设计一个观察者类,可以观察所有基类的衍生类, 这里使用set来保存这些需要更新的类。

一个事件相当于一个函数,事件发生(调用函数)同时自动调用需要更新的函数动作。


#pragma once

#include <iostream>
#include <string>
#include <set>
#include <vector>
using namespace std;

class Observer_Enemy
{
public:
	virtual void update(string name) = 0;
};

class Watcher_Enemy
{
public:
	virtual void registerObserver(Observer_Enemy *ob) = 0;
	virtual void removeObserver(Observer_Enemy *ob) =0;
	virtual void notifyObserver() = 0;
};

class SpyOnEnemy : public Watcher_Enemy
{
	set<Observer_Enemy *> obs;
	string enemy;
public:
	SpyOnEnemy():obs(), enemy()
	{
	}

	void registerObserver(Observer_Enemy *ob)
	{
		obs.insert(ob);
	}

	void enemyMove(string en)
	{
		enemy = en;
		notifyObserver();
	}

	void notifyObserver()
	{
		for (auto x:obs)
		{
			x->update(enemy);
		}
	}

	void removeObserver(Observer_Enemy *ob)
	{
		obs.erase(ob);
	}
};

class airForce : public Observer_Enemy
{
public:
	void update(string n)
	{
		cout<<"\nEnemy "<<n<<" move.\n"
			<<"AirForce get ready, moving out...\n";
	}
};

class Marine : public Observer_Enemy
{
public:
	void update(string n)
	{
		cout<<"\nEnemy "<<n<<" move.\n"
			<<"Marine take action...\n";
	}
};

class Tank : public Observer_Enemy
{
public:
	void update(string n)
	{
		cout<<"\nEnemy "<<n<<" move.\n"
			<<"Tank is ready, rolling...\n";
	}
};

void ObserVer_Enemy_Run()
{
	airForce airforce;
	Marine marine;
	Tank tank;

	SpyOnEnemy watcher;

	watcher.registerObserver(&airforce);
	watcher.registerObserver(&marine);
	watcher.registerObserver(&tank);

	string enemy;
	while (getline(cin, enemy))
	{
		watcher.enemyMove(enemy);
	}

	watcher.removeObserver(&airforce);
	watcher.enemyMove("The Last Soilder");
}

运行:

bubuko.com,布布扣


Design Pattern - Observer 观察者设计模式,布布扣,bubuko.com

Design Pattern - Observer 观察者设计模式

标签:des   class   blog   c   code   ext   

原文地址:http://blog.csdn.net/kenden23/article/details/26614355

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!