Design Pattern - Observer 观察者设计模式

本文介绍了一种用于实时观察并自动更新敌情状态的系统设计,通过设计观察者模式,实现对不同敌人移动事件的高效响应和处理。详细阐述了如何构建基类接口、观察者类以及注册/通知机制,确保在敌人移动时能触发相应的响应动作,如空军准备、步兵行动或坦克机动。通过实例演示,展示了如何灵活地添加或移除观察者以适应不同场景需求。

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");
}

运行:



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值