Posted on 2008-05-19 16:26
RichardHe 阅读(948)
评论(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--捐款救灾义不容辞! 说:
承认就行了,没必要在这个点上扣问题了吧.