`
javatar
  • 浏览: 1680214 次
  • 性别: Icon_minigender_1
  • 来自: 杭州699号
社区版块
存档分类
最新评论

[提问]观察者模式“感兴趣”的粒度控制

阅读更多
今天在写一个桌面程序,显示时用到了观察者模式
观察者模式中,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!
分享到:
评论
2 楼 javatar 2006-12-13  
谢谢你的答复,看来分开是要清晰点。
thanks!

补充:
已这么用了,发现这样易于实现推模式。
但聚集管理待抽象。
1 楼 taowen 2006-12-12  
个人感觉第一种是更好的设计。不相关方法放在同一个接口中,我看来就是一种偷懒的行为。接口和高阶函数(我把单方法的接口,看作高阶函数了)的差别,应该就是在于接口中的方法是概念上一体的,无法独立存在。如果接口中的方法不互相依赖,我觉得分开来一个个地做接口,对于设计意图的体现更明晰一些。

相关推荐

Global site tag (gtag.js) - Google Analytics