C++ Observer 实现

#include <vector>

#include "Observer.hpp"

 

#ifndef OBSERVABLE

#define OBSERVABLE

class Observable

{

private:

std::vector<Observer *> observers;

 

public:

Observable();

 

void registerObserver(Observer &o);

 

void deregisterObserver(Observer &o);

 

void notifyObservers();

 

void notifyObservers(void *arg);

 

void clearObservers();

 

int getCountOfObserver();

};

#endif

 

====================================

 

#ifndef OBSERVER

#define OBSERVER

 

class Observable;

 

class Observer

{

public:

virtual void update(Observable* const o, void *arg) = 0;

};

 

#endif

 

===================================

 

#include <stdlib.h>

#include <vector>

#include "Observable.hpp"

 

Observable::Observable()

{

 

}

 

void Observable::registerObserver(Observer &o) 

{

observers.push_back(&o);

}

 

void Observable::deregisterObserver(Observer &o) 

{

for (std::vector<Observer *>::iterator iter = observers.begin(); iter != observers.end(); ++iter)

{

if (*iter == &o)

{

observers.erase(iter);

break;

}

}

}

 

void Observable::notifyObservers()

{

notifyObservers(NULL);

}

 

void Observable::notifyObservers(void *arg)

{

for(std::vector<Observer *>::iterator iter = observers.begin(); iter != observers.end(); ++iter)

{

Observer *observer = (Observer *) (*iter);

observer->update(this, arg);

}

}

 

void Observable::clearObservers()

{

observers.clear();

}

 

 

int Observable::getCountOfObserver()

{

return observers.size();

}

 

=========================================

 

#include <stdio.h>

#include <assert.h>

#include "../lang/Observer.hpp"

#include "../lang/Observable.hpp"

 

class GenericObserver : public Observer

{

void update(Observable* const o, void *arg)

{

char *command = (char *) arg;

printf("[COMMAND] %s\n", command);

}

};

 

void testGetCountOfObserver() 

{

printf("test getCountOfObserver\n");

Observable o;

int count = o.getCountOfObserver();

printf("%d observers\n", count);

assert(count == 0);

}

 

void testRegisterObserver()

{

printf("test registerObserver\n");

Observable o;

int count = o.getCountOfObserver();

printf("%d observers\n", count);

assert(count == 0);

 

 

Observer *observer1 = new GenericObserver();

o.registerObserver(*observer1);

count = o.getCountOfObserver();

printf("%d observers\n", count);

assert(count == 1);

 

 

Observer *observer2 = new GenericObserver();

o.registerObserver(*observer2);

count = o.getCountOfObserver();

printf("%d observers\n", count);

assert(count == 2);

 

 

Observer *observer3 = new GenericObserver();

o.registerObserver(*observer3);

count = o.getCountOfObserver();

printf("%d observers\n", count);

assert(count == 3);

 

 

Observer *observer4 = new GenericObserver();

o.registerObserver(*observer4);

count = o.getCountOfObserver();

printf("%d observers\n", count);

assert(count == 4);

 

 

Observer *observer5 = new GenericObserver();

o.registerObserver(*observer5);

count = o.getCountOfObserver();

printf("%d observers\n", count);

assert(count == 5);

 

 

Observer *observer6 = new GenericObserver();

o.registerObserver(*observer6);

count = o.getCountOfObserver();

printf("%d observers\n", count);

assert(count == 6);

 

 

Observer *observer7 = new GenericObserver();

o.registerObserver(*observer7);

count = o.getCountOfObserver();

printf("%d observers\n", count);

assert(count == 7);

 

 

Observer *observer8 = new GenericObserver();

o.registerObserver(*observer8);

count = o.getCountOfObserver();

printf("%d observers\n", count);

assert(count == 8);

}

 

void testDeregisterObserver()

{

printf("test deregisterObserver\n");

Observable o;

int count = o.getCountOfObserver();

printf("%d observers\n", count);

assert(count == 0);

 

 

Observer *observer1 = new GenericObserver();

o.registerObserver(*observer1);

count = o.getCountOfObserver();

printf("%d observers\n", count);

assert(count == 1);

 

 

Observer *observer2 = new GenericObserver();

o.registerObserver(*observer2);

count = o.getCountOfObserver();

printf("%d observers\n", count);

assert(count == 2);

 

 

Observer *observer3 = new GenericObserver();

o.registerObserver(*observer3);

count = o.getCountOfObserver();

printf("%d observers\n", count);

assert(count == 3);

 

 

Observer *observer4 = new GenericObserver();

o.registerObserver(*observer4);

count = o.getCountOfObserver();

printf("%d observers\n", count);

assert(count == 4);

 

 

Observer *observer5 = new GenericObserver();

o.registerObserver(*observer5);

count = o.getCountOfObserver();

printf("%d observers\n", count);

assert(count == 5);

 

 

Observer *observer6 = new GenericObserver();

o.registerObserver(*observer6);

count = o.getCountOfObserver();

printf("%d observers\n", count);

assert(count == 6);

 

 

Observer *observer7 = new GenericObserver();

o.registerObserver(*observer7);

count = o.getCountOfObserver();

printf("%d observers\n", count);

assert(count == 7);

 

 

Observer *observer8 = new GenericObserver();

o.registerObserver(*observer8);

count = o.getCountOfObserver();

printf("%d observers\n", count);

assert(count == 8);

 

 

o.deregisterObserver(*observer1);

count = o.getCountOfObserver();

printf("%d observers\n", count);

assert(count == 7);

 

 

o.deregisterObserver(*observer2);

count = o.getCountOfObserver();

printf("%d observers\n", count);

assert(count == 6);

 

 

o.deregisterObserver(*observer3);

count = o.getCountOfObserver();

printf("%d observers\n", count);

assert(count == 5);

 

 

o.deregisterObserver(*observer4);

count = o.getCountOfObserver();

printf("%d observers\n", count);

assert(count == 4);

 

 

o.deregisterObserver(*observer5);

count = o.getCountOfObserver();

printf("%d observers\n", count);

assert(count == 3);

 

 

o.deregisterObserver(*observer6);

count = o.getCountOfObserver();

printf("%d observers\n", count);

assert(count == 2);

 

 

o.deregisterObserver(*observer7);

count = o.getCountOfObserver();

printf("%d observers\n", count);

assert(count == 1);

 

 

o.deregisterObserver(*observer8);

count = o.getCountOfObserver();

printf("%d observers\n", count);

assert(count == 0);

}

 

void testNotifyObservers()

{

printf("test notifyObservers\n");

Observable o;

int count = o.getCountOfObserver();

printf("%d observers\n", count);

assert(count == 0);

 

 

Observer *observer1 = new GenericObserver();

o.registerObserver(*observer1);

count = o.getCountOfObserver();

printf("%d observers\n", count);

assert(count == 1);

 

o.notifyObservers((void *) "fight");

 

Observer *observer2 = new GenericObserver();

o.registerObserver(*observer2);

count = o.getCountOfObserver();

printf("%d observers\n", count);

assert(count == 2);

 

o.notifyObservers((void *) "fight");

 

Observer *observer3 = new GenericObserver();

o.registerObserver(*observer3);

count = o.getCountOfObserver();

printf("%d observers\n", count);

assert(count == 3);

 

o.notifyObservers((void *) "fight");

 

Observer *observer4 = new GenericObserver();

o.registerObserver(*observer4);

count = o.getCountOfObserver();

printf("%d observers\n", count);

assert(count == 4);

 

o.notifyObservers((void *) "fight");

 

Observer *observer5 = new GenericObserver();

o.registerObserver(*observer5);

count = o.getCountOfObserver();

printf("%d observers\n", count);

assert(count == 5);

 

o.notifyObservers((void *) "fight");

 

 

Observer *observer6 = new GenericObserver();

o.registerObserver(*observer6);

count = o.getCountOfObserver();

printf("%d observers\n", count);

assert(count == 6);

 

o.notifyObservers((void *) "fight");

 

 

Observer *observer7 = new GenericObserver();

o.registerObserver(*observer7);

count = o.getCountOfObserver();

printf("%d observers\n", count);

assert(count == 7);

 

o.notifyObservers((void *) "fight");

 

 

Observer *observer8 = new GenericObserver();

o.registerObserver(*observer8);

count = o.getCountOfObserver();

printf("%d observers\n", count);

assert(count == 8);

 

o.notifyObservers((void *) "fight");

 

o.deregisterObserver(*observer1);

count = o.getCountOfObserver();

printf("%d observers\n", count);

assert(count == 7);

 

o.notifyObservers((void *) "fight");

 

o.deregisterObserver(*observer2);

count = o.getCountOfObserver();

printf("%d observers\n", count);

assert(count == 6);

 

o.notifyObservers((void *) "fight");

 

o.deregisterObserver(*observer3);

count = o.getCountOfObserver();

printf("%d observers\n", count);

assert(count == 5);

 

o.notifyObservers((void *) "fight");

 

o.deregisterObserver(*observer4);

count = o.getCountOfObserver();

printf("%d observers\n", count);

assert(count == 4);

 

o.notifyObservers((void *) "fight");

 

o.deregisterObserver(*observer5);

count = o.getCountOfObserver();

printf("%d observers\n", count);

assert(count == 3);

 

o.notifyObservers((void *) "fight");

 

o.deregisterObserver(*observer6);

count = o.getCountOfObserver();

printf("%d observers\n", count);

assert(count == 2);

 

o.notifyObservers((void *) "fight");

 

o.deregisterObserver(*observer7);

count = o.getCountOfObserver();

printf("%d observers\n", count);

assert(count == 1);

 

o.notifyObservers((void *) "fight");

 

o.deregisterObserver(*observer8);

count = o.getCountOfObserver();

printf("%d observers\n", count);

assert(count == 0);

 

o.notifyObservers((void *) "fight");

}

 

void testNotifyObserversDefault()

{

printf("test notifyObservers default\n");

Observable o;

int count = o.getCountOfObserver();

printf("%d observers\n", count);

assert(count == 0);

 

 

Observer *observer1 = new GenericObserver();

o.registerObserver(*observer1);

count = o.getCountOfObserver();

printf("%d observers\n", count);

assert(count == 1);

 

o.notifyObservers();

 

Observer *observer2 = new GenericObserver();

o.registerObserver(*observer2);

count = o.getCountOfObserver();

printf("%d observers\n", count);

assert(count == 2);

 

o.notifyObservers();

 

Observer *observer3 = new GenericObserver();

o.registerObserver(*observer3);

count = o.getCountOfObserver();

printf("%d observers\n", count);

assert(count == 3);

 

o.notifyObservers();

 

Observer *observer4 = new GenericObserver();

o.registerObserver(*observer4);

count = o.getCountOfObserver();

printf("%d observers\n", count);

assert(count == 4);

 

o.notifyObservers();

 

Observer *observer5 = new GenericObserver();

o.registerObserver(*observer5);

count = o.getCountOfObserver();

printf("%d observers\n", count);

assert(count == 5);

 

o.notifyObservers();

 

 

Observer *observer6 = new GenericObserver();

o.registerObserver(*observer6);

count = o.getCountOfObserver();

printf("%d observers\n", count);

assert(count == 6);

 

o.notifyObservers();

 

 

Observer *observer7 = new GenericObserver();

o.registerObserver(*observer7);

count = o.getCountOfObserver();

printf("%d observers\n", count);

assert(count == 7);

 

o.notifyObservers();

 

 

Observer *observer8 = new GenericObserver();

o.registerObserver(*observer8);

count = o.getCountOfObserver();

printf("%d observers\n", count);

assert(count == 8);

 

o.notifyObservers();

 

o.deregisterObserver(*observer1);

count = o.getCountOfObserver();

printf("%d observers\n", count);

assert(count == 7);

 

o.notifyObservers();

 

o.deregisterObserver(*observer2);

count = o.getCountOfObserver();

printf("%d observers\n", count);

assert(count == 6);

 

o.notifyObservers();

 

o.deregisterObserver(*observer3);

count = o.getCountOfObserver();

printf("%d observers\n", count);

assert(count == 5);

 

o.notifyObservers();

 

o.deregisterObserver(*observer4);

count = o.getCountOfObserver();

printf("%d observers\n", count);

assert(count == 4);

 

o.notifyObservers();

 

o.deregisterObserver(*observer5);

count = o.getCountOfObserver();

printf("%d observers\n", count);

assert(count == 3);

 

o.notifyObservers();

 

o.deregisterObserver(*observer6);

count = o.getCountOfObserver();

printf("%d observers\n", count);

assert(count == 2);

 

o.notifyObservers();

 

o.deregisterObserver(*observer7);

count = o.getCountOfObserver();

printf("%d observers\n", count);

assert(count == 1);

 

o.notifyObservers();

 

o.deregisterObserver(*observer8);

count = o.getCountOfObserver();

printf("%d observers\n", count);

assert(count == 0);

 

o.notifyObservers();

}

 

void testClearObservers()

{

printf("test clearObservers\n");

Observable o;

int count = o.getCountOfObserver();

printf("%d observers\n", count);

assert(count == 0);

 

 

Observer *observer1 = new GenericObserver();

o.registerObserver(*observer1);

count = o.getCountOfObserver();

printf("%d observers\n", count);

assert(count == 1);

 

o.notifyObservers();

 

Observer *observer2 = new GenericObserver();

o.registerObserver(*observer2);

count = o.getCountOfObserver();

printf("%d observers\n", count);

assert(count == 2);

 

o.notifyObservers();

 

Observer *observer3 = new GenericObserver();

o.registerObserver(*observer3);

count = o.getCountOfObserver();

printf("%d observers\n", count);

assert(count == 3);

 

o.notifyObservers();

 

Observer *observer4 = new GenericObserver();

o.registerObserver(*observer4);

count = o.getCountOfObserver();

printf("%d observers\n", count);

assert(count == 4);

 

o.notifyObservers();

 

Observer *observer5 = new GenericObserver();

o.registerObserver(*observer5);

count = o.getCountOfObserver();

printf("%d observers\n", count);

assert(count == 5);

 

o.notifyObservers();

 

 

Observer *observer6 = new GenericObserver();

o.registerObserver(*observer6);

count = o.getCountOfObserver();

printf("%d observers\n", count);

assert(count == 6);

 

o.notifyObservers();

 

 

Observer *observer7 = new GenericObserver();

o.registerObserver(*observer7);

count = o.getCountOfObserver();

printf("%d observers\n", count);

assert(count == 7);

 

o.notifyObservers();

 

 

Observer *observer8 = new GenericObserver();

o.registerObserver(*observer8);

count = o.getCountOfObserver();

printf("%d observers\n", count);

assert(count == 8);

 

o.notifyObservers();

 

o.clearObservers();

count = o.getCountOfObserver();

printf("%d observers\n", count);

assert(count == 0);

 

o.notifyObservers();

}

 

int main()

{

printf("Test design pattern Observer\n");

 

testGetCountOfObserver();

testRegisterObserver();

testDeregisterObserver();

testNotifyObservers();

testNotifyObserversDefault();

testClearObservers();

 

return 0;

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值