设为首页 加入收藏

TOP

《游戏编程模式》(2)(二)
2017-10-13 10:40:07 】 浏览:6586
Tags:《游戏编程模式》
st();

 

 

Chatper 4 观察者模式

观察者模式非常适合于一些不相关模块之间的通信(成就系统,新手引导)。

 

观察者:

 1 class Observer
 2 {
 3 public:
 4   virtual ~Observer() {}
 5   virtual void onNotify(const Entity& entity, Event event) = 0;
 6 };
 7 class Achievements : public Observer
 8 {
 9 public:
10   virtual void onNotify(const Entity& entity, Event event)
11   {
12     switch (event)
13     {
14     case EVENT_ENTITY_FELL:
15       if (entity.isHero() && heroIsOnBridge_)
16       {
17         unlock(ACHIEVEMENT_FELL_OFF_BRIDGE);
18       }
19       break;
20  
21       // Handle other events, and update heroIsOnBridge_...
22     }
23   }
24  
25 private:
26   void unlock(Achievement achievement)
27   {
28     // Unlock if not already unlocked...
29   }
30  
31   bool heroIsOnBridge_;
32 };

 

被观察者:

 1 class Subject
 2 {
 3 private:
 4   Observer* observers_[MAX_OBSERVERS];
 5   int numObservers_;
 6 };
 7 class Subject
 8 {
 9 public:
10   void addObserver(Observer* observer)
11   {
12     // Add to array...
13   }
14  
15   void removeObserver(Observer* observer)
16   {
17     // Remove from array...
18   }
19  
20   // Other stuff...
21 };
22 class Subject
23 {
24 protected:
25   void notify(const Entity& entity, Event event)
26   {
27     for (int i = 0; i < numObservers_; i++)
28     {
29       observers_[i]->onNotify(entity, event);
30     }
31   }
32  
33   // Other stuff...
34 };

 

单链表写法(避免造成动态内存分配):

 1 class Subject
 2 {
 3   Subject()
 4   : head_(NULL)
 5   {}
 6  
 7   // Methods...
 8 private:
 9   Observer* head_;
10 };
11 class Observer
12 {
13   friend class Subject;
14  
15 public:
16   Observer()
17   : next_(NULL)
18   {}
19  
20   // Other stuff...
21 private:
22   Observer* next_;
23 };
24 void Subject::addObserver(Observer* observer)
25 {
26   observer->next_ = head_;
27   head_ = observer;
28 }
29 void Subject::removeObserver(Observer* observer)
30 {
31   if (head_ == observer)
32   {
33     head_ = observer->next_;
34     observer->next_ = NULL;
35     return;
36   }
37  
38   Observer* current = head_;
39   while (current != NULL)
40   {
41     if (current->next_ == observer)
42     {
43       current->next_ = observer->next_;
44       observer->next_ = NULL;
45       return;
46     }
47  
48     current = current->next_;
49   }
50 }
51 void Subject::notify(const Entity& entity, Event event)
52 {
53   Observer* observer = head_;
54   while (observer != NULL)
55   {
56     observer->onNotify(entity, event);
57     observer = observer->next_;
58   }
59 }

C#:event关键字,观察者成为一个代理。

首页 上一页 1 2 下一页 尾页 2/2/2
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇PHP static静态属性和静态方法 下一篇ComponentPattern (组合模式)

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目