Discussion:
[問題] 請問java event的實現
(时间太久无法回复)
just do it
2007-03-15 07:38:38 UTC
Permalink
public class A{

private B b;

public A(){
b = new B();
}
}

public class B{

public B(){

}

public void doit(){

}

}

請問如何實現當class B自己發生doit()時, 通知class A發生了doit()事件
乾瞎!

--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 140.96.194.99
!H45
2007-03-15 08:31:40 UTC
Permalink
※ 引述《scdog (just do it)》之銘言:
: public class A{
: private B b;
: public A(){
: b = new B();
: }
: }
: public class B{
: public B(){
: }
: public void doit(){
: }
: }
: 請問如何實現當class B自己發生doit()時, 通知class A發生了doit()事件
: 乾瞎!

這個問題像是:只要B的doit()被呼叫,就通知A

在class B的member field新增Class A的reference
然後在Class A的member method新增一個通知的方法

原程式碼會變成
public class A{
private B b;
public A() { b = new B(); }

// new member method: "update" 用來處理要通知的事項
public void update(...) {
// TODO: 通知 A 的事項
}
}

public class B{

// new member field: "a" 作為要通知的對象
private A a;
public B() {}
public void doit() {

// 在此通知 A: "doit() 被呼叫了"
a.update(...);
}
}

如果要通知的物件太多,那麼可以考慮用一個容器去裝
另外,如果太多物件都要進行通知的動作,那麼可以考慮進行一般化
而這就是Observer Pattern

http://java.sun.com/javase/6/docs/api/java/util/Observable.html
http://java.sun.com/javase/6/docs/api/java/util/Observer.html

--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 140.115.205.85
just do it
2007-03-15 08:45:03 UTC
Permalink
※ 引述《H45 (!H45)》之銘言:
: ※ 引述《scdog (just do it)》之銘言:
: : public class A{
: : private B b;
: : public A(){
: : b = new B();
: : }
: : }
: : public class B{
: : public B(){
: : }
: : public void doit(){
: : }
: : }
: : 請問如何實現當class B自己發生doit()時, 通知class A發生了doit()事件
: : 乾瞎!
: 這個問題像是:只要B的doit()被呼叫,就通知A
: 在class B的member field新增Class A的reference
: 然後在Class A的member method新增一個通知的方法
: 原程式碼會變成
: public class A{
: private B b;
: public A() { b = new B(); }
: // new member method: "update" 用來處理要通知的事項
: public void update(...) {
: // TODO: 通知 A 的事項
: }
: }
: public class B{
: // new member field: "a" 作為要通知的對象
: private A a;
: public B() {}
: public void doit() {
: // 在此通知 A: "doit() 被呼叫了"
: a.update(...);
: }
: }
: 如果要通知的物件太多,那麼可以考慮用一個容器去裝
: 另外,如果太多物件都要進行通知的動作,那麼可以考慮進行一般化
: 而這就是Observer Pattern
: http://java.sun.com/javase/6/docs/api/java/util/Observable.html
: http://java.sun.com/javase/6/docs/api/java/util/Observer.html


感謝各位大大幫忙
但是A和B之間的關係是A include B,故code中我不能寫成B include A
在B中沒交代清楚
void doit(){

loop{
// if something happen in the loop, it must notify A right away
}
}

observe方式看起來好像不能主動通知class a資料已經改變
需要A自己去查詢
所以只好用event的方式
不知這樣對不對....
乾瞎!


--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 140.96.194.99
!H45
2007-03-15 09:36:03 UTC
Permalink
※ 引述《scdog (just do it)》之銘言:
: ※ 引述《H45 (!H45)》之銘言:
: : 這個問題像是:只要B的doit()被呼叫,就通知A
: : 在class B的member field新增Class A的reference
: : 然後在Class A的member method新增一個通知的方法
: : 原程式碼會變成
: : public class A{
: : private B b;
: : public A() { b = new B(); }
: : // new member method: "update" 用來處理要通知的事項
: : public void update(...) {
: : // TODO: 通知 A 的事項
: : }
: : }
: : public class B{
: : // new member field: "a" 作為要通知的對象
: : private A a;
: : public B() {}
: : public void doit() {
: : // 在此通知 A: "doit() 被呼叫了"
: : a.update(...);
: : }
: : }
: : 如果要通知的物件太多,那麼可以考慮用一個容器去裝
: : 另外,如果太多物件都要進行通知的動作,那麼可以考慮進行一般化
: : 而這就是Observer Pattern
: : http://java.sun.com/javase/6/docs/api/java/util/Observable.html
: : http://java.sun.com/javase/6/docs/api/java/util/Observer.html
: 感謝各位大大幫忙
: 但是A和B之間的關係是A include B,故code中我不能寫成B include A
: 在B中沒交代清楚
: void doit(){
: loop{
: // if something happen in the loop, it must notify A right away
: }
: }
: observe方式看起來好像不能主動通知class a資料已經改變
: 需要A自己去查詢
: 所以只好用event的方式
^^^^^
我先專門針對event回文

所謂的event方式,是指外界dispatchEvent(Event e)到指定的物件之後
會呼叫該物件的processEvent(Event e)
然後此函數會再呼叫對應的process<event type>Event(Event e)
接著從已登記的Listeners中取出<event type>Listener
再呼叫此Listener對應此event的方法,完成整個event的處理

http://java.sun.com/javase/6/docs/api/java/awt/Component.html

我認為原問題不需要用到event方式......
再者,我所寫的程式碼並非不能主動通知class a資料已經改變
請你再確認一次看看

: 不知這樣對不對....
: 乾瞎!

--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 140.115.205.85
Alien
2007-03-15 10:11:48 UTC
Permalink
※ 引述《scdog (just do it)》之銘言:
: 感謝各位大大幫忙
: 但是A和B之間的關係是A include B,故code中我不能寫成B include A
A "include" B 不代表 B 不能有 reference to A

你先去看看 observer pattern 理解理解吧

class A {
B child = new B(this);

public void onNotify() {}
}

class B {
A parent;
B(A parent) { this.parent = parent;}

public void doIt() {
parent.onNotify();
}
}


: 在B中沒交代清楚
: void doit(){
: loop{
: // if something happen in the loop, it must notify A right away
: }
: }
: observe方式看起來好像不能主動通知class a資料已經改變
: 需要A自己去查詢
: 所以只好用event的方式
: 不知這樣對不對....
: 乾瞎!

所謂 event 不也是 observer 嗎?

Alien

--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 202.22.246.26
※ 編輯: adrianshum 來自: 202.22.246.26 (03/15 18:11)
淺水中
2007-03-15 15:05:50 UTC
Permalink
y※ 引述《scdog (just do it)》之銘言:
: public class A{
: private B b;
: public A(){
: b = new B();
: }
: }
: public class B{
: public B(){
: }
: public void doit(){
: }
: }
: 請問如何實現當class B自己發生doit()時, 通知class A發生了doit()事件
: 乾瞎!

public interface DoListener{
public void doit();
}

public class B{
private DoListener listener;
public void addDoListener(DoListener listener){
this.listener = listener;
}
public void doit(){
listener.doit();
}
}
當你B.doit()時就會去call a.doit();



public class A implements DoListener{
private B b = new B();
public A(){
b.addDoListener(this);
}
public void doit(){
...你想要的code都可以寫在這裡;
}
}

建議B用Singleton Design Pattern來設計


--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 140.123.105.36
a***@kkcity.com.tw
2007-03-15 16:31:24 UTC
Permalink
Post by 淺水中
建議B用Singleton Design Pattern來設計
無緣無故為什麼要用 Singleton?

我常說一句, Singleton 是最常見但又最常被誤用的 Pattern.

Alien
--
┌─────◆KKCITY◆─────┐ ● KKCITY 市民小常識  ●
│ bbs.kkcity.com.tw │ Q:文章標題前有#符號是代表什麼意思?
└──《From:219.79.103.85 》──┘ A:被作者加密了,需輸入密碼才能閱讀
--
淺水中
2007-03-16 04:40:05 UTC
Permalink
※ 引述《***@kkcity.com.tw ( )》之銘言:
: ※ 引述《***@ptt.cc (淺水中)》之銘言:
: > 建議B用Singleton Design Pattern來設計
: 無緣無故為什麼要用 Singleton?
: 我常說一句, Singleton 是最常見但又最常被誤用的 Pattern.
: Alien
這只是我自己的看法
當你在為一個Library寫一個Event Dispatcher時
為了避免在RunTime的時候有兩份
以確保以每個add到Event Dispatcher時都能被同一個instance
給管理,我認為Singleton是最好的選擇
當然你寫程式的時候都很清楚自己在幹甚麼
你也可以不要使用這種方法..
為了佐證我的看法
你可以參考這個Open source project的event package
http://www.igniterealtime.org/builds/wildfire/docs/latest/documentation/javadoc/org/jivesoftware/wildfire/event/package-frame.html

--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 140.123.105.36

Loading...