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

运行:

Design Pattern - Observer 观察者设计模式

时间: 2024-10-11 11:58:05

Design Pattern - Observer 观察者设计模式的相关文章

Design Pattern Prototype 原型设计模式

Prototype设计模式其实就是利用一个深拷贝的功能,在原有的类中,通过一个clone函数,创建一个新的类,并可以利用好原有的数据. 这样可以轻易clone出多个新的对象操作,而且都有各自的内存空间. #include <string> #include <iostream> using namespace std; class MultiData { protected: bool b; char c; string s; int a; public: virtual Mult

Abstract Factory Design Pattern 抽象工厂设计模式 - 总结

Abstract Factory Design Pattern 就是一般的Factory Design Pattern的进一步设计,增加一个抽象工厂,然后利用这个工厂可以创建不同基类的类. 当我们需要创建更多不同类的时候就可以使用这个设计模式了. 这个设计模式的代码相对会多点,但是其中的思想就是一般Factory Design Pattern,然后集合更多的基类,看起来挺大的一个设计模式,其思想是挺简单的. 其中具体的实现细节当然是可以有多种实现方法的: 1 利用Factory的基类衍生出不同的

Flyweight Design Pattern 共享元设计模式

就是利用一个类来完成多种任务,不用每次都创建一个新类. 个人觉得这个设计模式在C++里面,好像可以就使用一个函数代替,利用反复调用这个函数完成任务和反复利用这个类,好像差不多. 不过既然是一个设计模式,那么就使用类来完成任务.而对于Java来说是不面向过程的,故此就必须使用这个设计模式了. 我这里设计一个仓库来保存这样的类,需要的时候反复取出来使用. 非常简单的设计模式: #include <stdio.h> class ReusedObject { public: ReusedObject(

Design Pattern Bridge 桥设计模式

桥设计模式其实就是一个简单的has a relationship,就是一个类拥有另一个类,并使用另一个类实现需要的功能. 比如遥控器和电视之间可以使用桥设计模式达到可以使用同一个遥控器控制多台电视机的目的. 这样的设计思想是多种设计模式反反复复使用基本思想. 仔细思考下会发现多种设计模式的底层思想其实是相通的,不过具体实现或者某些细节,应用等有那么一点差别罢了. 下面就实现一个TV和remoter类,其中的remoter是可以随时更换的. #include <stdio.h> class Re

design pattern Builder 建造者设计模式

其实设计模式可以学的很有意思的,不需要非得如此硬枯燥地去啃FOG的大部头,当然这些骨头啃啃也健康. 本文利用建造者模式设计一个有趣的场景,一个利用这个模式去学功夫的过程,呵呵. 首先设计一个基类,学功夫先要有基础嘛: class 功夫 { public: virtual void 看招() = 0; }; 有了基础之后,我们就可以学习高级功法了,这里学习降龙十八掌,O(∩_∩)O~. list<int>容器,相当于记录下来的武功招式了,记住这些招式之后就可以开始学习了.小宝曰:绝世武功这么厚,

Design Pattern Facade 门面设计模式

Facade设计模式主要作用是因为有个很难使用的类,然后要设计一个新类,整理好这个类,使得其更好使用. 比如有类如此: class MessyClass { char *name; public: MessyClass() : name(new char[3]) { for (int i = 0; i < 3; i++) { name[i] = ' '; } } ~MessyClass() { delete [] name; } void setFirstName(char a) { name[

Design Pattern Memo 备忘录设计模式

本设计模式就是简单地记录当前状态,然后利用记录的数据恢复. 比如首先我们有一个类,类需要记录当前状态进行相关的工作的: class Memo; class Human { public: string state; Memo *makeMemo(); void restroDataFromMemo(Memo *m); void show() { cout<<"State: "<<state<<endl; } }; 这里面的state可以是任意定义的数

Design Pattern Iterator 迭代器设计模式

这个设计模式感觉非常简单,我们平时写程序的时候也是经常需要调用iterator的,C++和Java都是. 所以感觉没什么特别的,就是需要模仿C++或者Java的iterator类的功能吧. 这里简单写个,使用C++模仿Java的iterator一些功能,呵呵. 首先我们有一个集合类,而这个集合类包含了其他类,当我们需要遍历这个集合类包含的类的时候,就好使用iterator功能了. 比如有一个原始的类: class SalesPerson { private: string name; strin

Design Pattern Visitor 访问者设计模式

访问者设计模式是已经有了一组Person对象了,然后不同的访问者访问这组对象,会有不同效果. 这些访问者实际上就是一个可以让Person对象组执行的动作行为等. 至于这些Person对象是如何执行这些访问者的动作的,那是已经在特定的不同的Person对象中设计好的. 比如我们的访问者也许是一些动作集合的类,如: class Action { public: string present; string gun; virtual void drinkBeer(Person *p) = 0; vir