浏览 2738 次
锁定老帖子 主题:[提问]观察者模式“感兴趣”的粒度控制
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2006-12-12
观察者模式中,Observer向Subject注册感兴趣的事件, 其中对“感兴趣”的粒度控制, 如果Subject有多个事件,不同的Observer对不同的事件感兴趣,也可能重叠 1.在Subject中保持多个Observer聚集,每个聚集表示对某一事件感兴趣, 将Observer注册到各个聚集, 这样的话。如果同一Observer对两个事件感兴趣,就要注册两次, 而且聚集的管理也较麻烦addObserver,removeObserver要写几个 2.将所有事件方法都纳入同一Observer接口, Subject只维护一个Observer聚集, 具体Observer实现接口时,对不感兴趣的事件函数留空。 这样的话,如果有很多事件,每个Observer可能只对一个感兴趣, 却要实现一个这么大的接口,也不合最少知道原则, Java中的AWT事件就是这样做的,如WindowListener等 3.同2一样只Subject只维护一个Observer聚集, 而且Observer接口只有一个方法,具体事件类型用一个状态位传参表示, 这样的话,事件函数表意不清,传参也必需保证所有事件一样,丧失灵活性, 或用Object弱类型传参,在具体Observer还要用instanceof判断, 加上事件类型状态位的判断,会出现很多if else,丧失多态性。 eclipse的SWT就是用的这样做的。 它们的优劣,难以取舍,请各位给点建议。 thanks! 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2006-12-12
个人感觉第一种是更好的设计。不相关方法放在同一个接口中,我看来就是一种偷懒的行为。接口和高阶函数(我把单方法的接口,看作高阶函数了)的差别,应该就是在于接口中的方法是概念上一体的,无法独立存在。如果接口中的方法不互相依赖,我觉得分开来一个个地做接口,对于设计意图的体现更明晰一些。
|
|
返回顶楼 | |
发表时间:2006-12-13
谢谢你的答复,看来分开是要清晰点。
thanks! 补充: 已这么用了,发现这样易于实现推模式。 但聚集管理待抽象。 |
|
返回顶楼 | |