Posted on 2008-05-19 16:26
RichardHe 閱讀(957)
評論(0) 編輯 收藏 引用
監聽器的注冊與使用,也就是設計模式中的觀察模式(observer),一對多關系
update的參數應該是subject,可以這樣認為,如果把subject當作老師,observer當作學生的
話,那就比較容易明白了,update(subject* sub),也就是老師的狀態發生改變時,學生也要
發生改變,并且發的變化是由老師這個參數來決定;既對老師進行監聽..偽代碼如下:
1 class Student;
2 class Teacher
3 {
4 public:
5 Teacher(){}
6 ~Teacher(){}
7 //把學生注冊到老師中.
8 void attach(Student* stu){stlist.push_back(stu);}
9 void detach(Student* std);{//不用的對象刪除}
10 STATE getSate();
11 //對每個學生通知
12 void notify(){
13 std::list<Student*>::iterator it=m_stlist.begin();
14 for(it;it <=m_stlist.end(); ++it)
15 { (*it)->update(this);
16 }
17 private:
18 typedef std::list<Student*> StudentList;
19 StudentList m_stlist;
20 };
21
22 class Student
23 {
24 public:
25 Student();
26 ~Student();
27 void update(Teacher* teach){teach->getState();//根據老師的狀態來決定所要做的事.}
28 };
朋友們的討論:
unix_koria--捐款救災義不容辭! 說:
因為 stu的update是由老師觸發unix_koria--捐款救災義不容辭! 說:
實際的工程中,一般都需要知道是哪個具體對象觸發這種事件kun123456765 說:
但是我覺得在這里不是必須的
unix_koria--捐款救災義不容辭! 說:
update實際就是個事件而已,給teacher參數,那么可以在stu和tea之間建立聯系啊。kun123456765說:
我認為 可以根據實際情況來 決定 子對象 是否 需要知道 什么是父對象
unix_koria--捐款救災義不容辭! 說:
但大部分都是需要的。
Richard He 說:
還有其它的優點嗎?
kun123456765 說:
恩,在Student中 保存一個Teacher*
unix_koria--捐款救災義不容辭! 說:
還會有回調要求的。
kun123456765 說:
在構造的時候就傳遞
new stu (this)
unix_koria--捐款救災義不容辭! 說:
即update里 很多時候需要通知 宿主
unix_koria--捐款救災義不容辭! 說:
在構造的時候就傳遞
new stu (this)
這樣就限制太死了。
unix_koria--捐款救災義不容辭! 說:
學生就是學生.
kun123456765 說:
也可以換個別的方式。
但是我還是認為 不是必須,而是根據需求來的。
觀察者模式的重點應該在通知機制
unix_koria--捐款救災義不容辭! 說:
..............
unix_koria--捐款救災義不容辭! 說:
如果不傳進個老師,有什么優點?
kun123456765說:
不知道。
unix_koria--捐款救災義不容辭! 說:
設計模式 說的是 大部分通常的做法.....
unix_koria--捐款救災義不容辭! 說:
沒說一定要那樣,哈哈,你覺得不爽那就不用噶。...
unix_koria--捐款救災義不容辭! 說:
但傳了teacher指針,則可以兼容更多情況。
kun123456765 說:
這點我承認。
unix_koria--捐款救災義不容辭! 說:
因為指針可以為NULL
unix_koria--捐款救災義不容辭! 說:
承認就行了,沒必要在這個點上扣問題了吧.