add Observer Pattern
parent
ea62a3b182
commit
3b7a291d50
Binary file not shown.
After Width: | Height: | Size: 11 KiB |
Binary file not shown.
After Width: | Height: | Size: 16 KiB |
|
@ -0,0 +1,55 @@
|
|||
#include "AllyCenter.h"
|
||||
#include "Observer.h"
|
||||
|
||||
/*********** AllyCenter ****************/
|
||||
AllyCenter::AllyCenter(){
|
||||
printf("大吉大利,今晚吃鸡!\n");
|
||||
}
|
||||
|
||||
// 加入玩家
|
||||
void AllyCenter::join(Observer* player){
|
||||
if (playerList.size() == 4){
|
||||
printf("玩家已满\n");
|
||||
return;
|
||||
}
|
||||
printf("玩家 %s 加入\n", player->getName().c_str());
|
||||
playerList.push_back(player);
|
||||
if (playerList.size() == 4){
|
||||
printf("组队成功,不要怂,一起上!\n");
|
||||
}
|
||||
}
|
||||
// 移除玩家
|
||||
void AllyCenter::remove(Observer* player){
|
||||
printf("玩家 %s 退出\n", player->getName().c_str());
|
||||
//playerList.remove(player);
|
||||
}
|
||||
/*********** AllyCenter ****************/
|
||||
|
||||
|
||||
/********** AllyCenterController *******/
|
||||
AllyCenterController::AllyCenterController(){
|
||||
|
||||
}
|
||||
|
||||
// 实现通知方法
|
||||
void AllyCenterController::notify(INFO_TYPE infoType, std::string name){
|
||||
switch (infoType){
|
||||
case RESOURCE:
|
||||
for each (Observer* obs in playerList){
|
||||
if (obs->getName() != name){
|
||||
((Player*)obs)->come();
|
||||
}
|
||||
}
|
||||
break;
|
||||
case HELP:
|
||||
for each (Observer* obs in playerList){
|
||||
if (obs->getName() != name){
|
||||
((Player*)obs)->help();
|
||||
}
|
||||
}
|
||||
break;
|
||||
default:
|
||||
printf("Nothing\n");
|
||||
}
|
||||
}
|
||||
/********** AllyCenterController *******/
|
|
@ -0,0 +1,36 @@
|
|||
#ifndef __ALLYCENTER_H__
|
||||
#define __ALLYCENTER_H__
|
||||
|
||||
#include "common.h"
|
||||
#include <vector>
|
||||
|
||||
// 前向声明
|
||||
class Observer;
|
||||
class Player;
|
||||
|
||||
// 抽象目标:联盟中心
|
||||
class AllyCenter
|
||||
{
|
||||
public:
|
||||
AllyCenter();
|
||||
// 声明通知方法
|
||||
virtual void notify(INFO_TYPE infoType, std::string name) = 0;
|
||||
// 加入玩家
|
||||
void join(Observer* player);
|
||||
// 移除玩家
|
||||
void remove(Observer* player);
|
||||
protected:
|
||||
// 玩家列表
|
||||
std::vector<Observer*>playerList;
|
||||
};
|
||||
|
||||
// 具体目标
|
||||
class AllyCenterController :public AllyCenter
|
||||
{
|
||||
public:
|
||||
AllyCenterController();
|
||||
// 实现通知方法
|
||||
void notify(INFO_TYPE infoType, std::string name);
|
||||
};
|
||||
|
||||
#endif //__ALLYCENTER_H__
|
|
@ -0,0 +1,67 @@
|
|||
#define __DEMO_H__
|
||||
#ifdef __DEMO_H__
|
||||
|
||||
using namespace std;
|
||||
#include <list>
|
||||
|
||||
// 抽象观察者
|
||||
class Observer
|
||||
{
|
||||
public:
|
||||
// 声明响应更新方法
|
||||
virtual void update() = 0;
|
||||
};
|
||||
|
||||
// 具体观察者
|
||||
class ConcreteObserver:public Observer
|
||||
{
|
||||
public:
|
||||
// 实现响应更新方法
|
||||
void update(){
|
||||
// 具体操作
|
||||
}
|
||||
};
|
||||
|
||||
// 抽象目标
|
||||
class Subject
|
||||
{
|
||||
public:
|
||||
// 添加观察者
|
||||
void attach(Observer* obs){
|
||||
obsList.push_back(obs);
|
||||
}
|
||||
// 移除观察者
|
||||
void detach(Observer* obs){
|
||||
obsList.remove(obs);
|
||||
}
|
||||
// 声明通知方法
|
||||
virtual void notify() = 0;
|
||||
protected:
|
||||
// 观察者列表
|
||||
list<Observer*>obsList;
|
||||
};
|
||||
|
||||
// 具体目标
|
||||
class ConcreteSubject :public Subject
|
||||
{
|
||||
public:
|
||||
// 实现通知方法
|
||||
void notify(){
|
||||
// 具体操作
|
||||
// 遍历通知观察者对象
|
||||
for (int i = 0; i < obsList.size(); i++){
|
||||
obsList[i]->update();
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
// 客户端代码示例
|
||||
int main()
|
||||
{
|
||||
Subject *sub = new ConcreteSubject();
|
||||
Observer *obs = new ConcreteObserver();
|
||||
sub->attach(obs);
|
||||
sub->notify();
|
||||
return 0;
|
||||
}
|
||||
#endif
|
|
@ -0,0 +1,59 @@
|
|||
#ifndef __OBSERVER_H__
|
||||
#define __OBSERVER_H__
|
||||
|
||||
#include <iostream>
|
||||
using namespace std;
|
||||
#include "common.h"
|
||||
#include "AllyCenter.h"
|
||||
|
||||
// 抽象观察者 Observer
|
||||
class Observer
|
||||
{
|
||||
public:
|
||||
Observer(){}
|
||||
// 声明抽象方法
|
||||
virtual void call(INFO_TYPE infoType, AllyCenter* ac) = 0;
|
||||
string getName(){
|
||||
return name;
|
||||
}
|
||||
void setName(string iName){
|
||||
this->name = iName;
|
||||
}
|
||||
private:
|
||||
string name;
|
||||
};
|
||||
|
||||
// 具体观察者
|
||||
class Player :public Observer
|
||||
{
|
||||
public:
|
||||
Player(){
|
||||
setName("none");
|
||||
}
|
||||
Player(string iName){
|
||||
setName(iName);
|
||||
}
|
||||
// 实现
|
||||
void call(INFO_TYPE infoType, AllyCenter* ac){
|
||||
switch (infoType){
|
||||
case RESOURCE:
|
||||
printf("%s :我这里有物资\n", getName().c_str());
|
||||
break;
|
||||
case HELP:
|
||||
printf("%s :救救我\n", getName().c_str());
|
||||
break;
|
||||
default:
|
||||
printf("Nothing\n");
|
||||
}
|
||||
ac->notify(infoType, getName());
|
||||
}
|
||||
// 实现具体方法
|
||||
void help(){
|
||||
printf("%s:坚持住,我来救你!\n", getName().c_str());
|
||||
}
|
||||
void come(){
|
||||
printf("%s:好的,我来取物资\n", getName().c_str());
|
||||
}
|
||||
};
|
||||
|
||||
#endif
|
|
@ -0,0 +1,10 @@
|
|||
#ifndef __COMMON_H__
|
||||
#define __COMMON_H__
|
||||
|
||||
enum INFO_TYPE{
|
||||
NONE,
|
||||
RESOURCE,
|
||||
HELP
|
||||
};
|
||||
|
||||
#endif //__COMMON_H__
|
|
@ -0,0 +1,32 @@
|
|||
#include "Observer.h"
|
||||
#include "AllyCenter.h"
|
||||
|
||||
int main()
|
||||
{
|
||||
// 创建一个战队
|
||||
AllyCenterController* controller = new AllyCenterController();
|
||||
|
||||
// 创建4个玩家,并加入战队
|
||||
Player* Jungle = new Player("Jungle");
|
||||
Player* Single = new Player("Single");
|
||||
Player* Jianmengtu = new Player("贱萌兔");
|
||||
Player* SillyDog = new Player("傻子狗");
|
||||
controller->join(Jungle);
|
||||
controller->join(Single);
|
||||
controller->join(Jianmengtu);
|
||||
controller->join(SillyDog);
|
||||
|
||||
printf("\n\n");
|
||||
|
||||
// Jungle发现物资,呼叫队友
|
||||
Jungle->call(RESOURCE, controller);
|
||||
|
||||
printf("\n\n");
|
||||
|
||||
// 傻子狗遇到危险,求救队友
|
||||
SillyDog->call(HELP, controller);
|
||||
|
||||
printf("\n\n");
|
||||
system("pause");
|
||||
return 0;
|
||||
}
|
Loading…
Reference in New Issue