您的位置:首页 > 其它

Design Pattern - Observer 观察者设计模式

2014-05-22 18:45 323 查看
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");
}


运行:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: