作者H45 (!H45)
看板OOAD
标题Re: [模式] Observer Pattern 模式的一些问题
时间Sun Jan 1 21:33:45 2012
※ 引述《guestid (访客ID)》之铭言:
: 最近在看Head First Design Pattern这本书的Observer Pattern (新手不是很懂)
: 书中有提到Java中内建的Observable及Observer可用来实作Observer Pattern
: Subject class A 要继承(extends) Observable class
: Observer class B 要实作 Observer 这个interface
: 问题一:
: 本版的范例中没有下面注解的那两行, 书上却多了这两行, 目的何在?
目的是在 Observer 物件中存放一个 Observable 物件
使後续 Observer 物件被 notify 的时候,有能力呼叫 Observable 物件的方法。
: public class B implements Observer {
: Observable obs; // 为什麽要有这行????
: public B(Observable obs) {
: this.obs = obs; // 还有这行????
: obs.addObserver(this);
: }
: }
: 自问自答:
: 不要这两行也可以
: 为了让class B 可以自己unregister , 不再observe 就需要这两行
确实
存放一个 Observable 物件在 Observer 物件中
Observer 可以视情况 unregister 自己。
此答案也是我上面回答的一个实例。
: 问题二:
: 听说interface 如 KeyListener、ActionListener,...等也是Observer Pattern
: 似乎实务上在实作这类interface时, 好像都没有人去实作建构子(像问题一这样),
视需求而定
通常 actionPerformed 函式所需要的资讯
由 ActionEvent 物件提供就足够了
但有些情况,ActionEvent 提供的资讯不足
像是上一次执行的时间点
需要自己记录在 myActionListener 的 field 中
类此这种 myActionListener 有 field 的情况
大多要实作建构子来初始化这些 field 的初始值
: 而是类似下面这样做:
: public class myActionListener implements ActionListener
: {
: public void actionPerformed(ActionEvent e) {
: }
: }
: 自问自答:
: 因为要保持弹性, 让Subject在需要时再以addActionListener(ActionListener a)去
: 注册即可(是吗= = 这个回答自己都觉得有点勉强)
我第一感的回答是,他没写建构子,不代表你不可以写
你可以依照自己的需求来调整物件的设计
如果加一个建构子在 Observer 合乎物件的守则
那就大方地加上去
: 问题三:
: 我如果要在问题二中的myActionListener加个建构子(像问题一这样), 要怎麽加呢?
: 就用Observable当引数的型别? 还是用ActionEvent? 还是用Button >"<
: 到底谁是Subject阿?
Subject 就是 Observable 物件。
一样的问题一样的答案:依您的需求而定
先问问您自己:为什麽要加建构子呢 :)
: 因为我对这个不是很懂, 不知道这样表达各位是不是看的懂我要表达的意思
OK.
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 140.116.247.22
1F:推 guestid :我懂了!Pattern是活的~没有说一定要照教科书 01/02 22:41
2F:→ guestid :上的类别图依样画葫芦~ 01/02 22:41
3F:→ guestid :例如Listener这个Observer, 通常没有主动权决定要 01/02 22:44
4F:→ guestid :依附在哪个Suject (主动权在Suject), 所以通常就不必 01/02 22:46
5F:→ guestid :有那个建构子去取得Suject 01/02 22:47
6F:→ guestid :教科书只是经典的例子, 不适用在所有情况 01/02 22:48
7F:→ H45 :大致上正如你说所的那样 :) 01/03 00:45
8F:→ adrianshum :我觉得应该想成:要理解书上面的"葫芦" 的重点是什麽 01/04 00:16
9F:→ adrianshum :比如Observer Pattern 的重点不在於有ctor 与否,那 01/04 00:16
10F:→ adrianshum :麽当然不需依据书上例子去决定有什麽样的 ctor 01/04 00:17
11F:→ adrianshum :不过书上说到的重点还是要依,不然很容易就犯了前人 01/04 00:19
12F:→ adrianshum :犯过的问题。比如 Singleton 的 private ctor 就是要 01/04 00:19
13F:→ adrianshum :依样画的其中一个葫芦。 01/04 00:20