Re: [模式] Observer Pattern 模式的一些问题

楼主: H45 (!H45)   2012-01-01 21:33:45
※ 引述《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.

Links booklink

Contact Us: admin [ a t ] ucptt.com