學過awt,尤其是swing的就知道,swing中observer模式被大量的使用。比如,button.addActionListener(...)后,一旦你點擊button后就能觸發(fā)相應(yīng)的事件。很多人一定想知道內(nèi)部的機制。
假設(shè)有一臺電腦。電腦里面有一個事件,當你按下電源按鈕的時候,那么顯示器會亮,電源指示燈也會亮。
Examda提示:這是典型的一個類似于GUI中按鈕事件模擬。
我們來分析一下需要幾個類
電腦肯定是需要的,我們得出Computer類。Computer類內(nèi)部有一個按電源按鈕的動作,我們叫做clickButton.這個事件我們叫做EventPowerOn.于是得出了EventPowerOn類。另外,對比GUI里面的button,他們都會添加監(jiān)聽器,所以應(yīng)該有個監(jiān)聽器類,我們叫做EventPowerOnListener。好到這里我們基本上找出了幾個必須的類Computer,EventPowerOn ,EventPowerOnListener
我們寫出他們的框架:
public class Computer implements Runnable{
public void clikButton(){}//該方法如果被調(diào)用,那么說明電源按鈕被按下
}
public class EventPowerOn {
private Object source;//事件的來源,也就是時間是由哪一個對象激發(fā)的
private long time;//這個屬性是隨意添加的 比如社么時候電源按鈕被按下
public EventPowerOn( long time, Object object) {
super();
this.source = object;
this.time = time;
}
public Object getObject() {
return source;
}
public void setObject(Object object) {
this.source = object;
}
public long getTime() {
return time;
}
public void setTime(long time) {
this.time = time;
}
}
public interface EventPowerOnListener {
public void performanceToPowerOn(EventPowerOn eventPowerOn);//改方法是電源按鈕被
//按后應(yīng)的響應(yīng)
}
Examda提示:剛才我們說,電源按鈕被按下,那么顯示器和電源指示器會變亮。那么顯示器和電源指示器應(yīng)該都另外做一個類
所以有:
public class Screen implements EventPowerOnListener{
public void performanceToPowerOn(EventPowerOn eventPowerOn) {
System.out.println(eventPowerOn.getTime());
System.out.println("Screen is on");
}
}
public class Light implements EventPowerOnListener{
public void performanceToPowerOn(EventPowerOn eventPowerOn) {
System.out.println(eventPowerOn.getTime());
System.out.println("power light is on");
}
}
為什么我們要用他們實現(xiàn)監(jiān)聽器類呢,因為對computer來說,他們都是監(jiān)聽器。一旦電源按鈕被按下,顯示器和電源指示器就應(yīng)該要有反應(yīng)。
那么如何將screen 和light添加進computer 呢。我們做如下的改動
public class Computer {
private List listeners=new ArrayList();
public void addEventPowerOnListener(EventPowerOnListener eventPowerOnListener)
{
listeners.add(eventPowerOnListener);
}
public void clikButton(){
for(EventPowerOnListener temp:listeners)
{
temp.performanceToPowerOn(new EventPowerOn(System.currentTimeMillis(),this) );
}
}
}
好了,一個模擬的例子就完成了。我們來測試一下:
public class testObserver {
public static void main(String[] args){
Computer computer=new Computer();
Screen screen=new Screen();
Light light=new Light();
computer.addEventPowerOnListener(screen);
computer.addEventPowerOnListener(light);
computer.click();
};
}
看戲結(jié)果:
1219215665656
Screen is on
1219215665656
power light is on
說明clickButton,那么顯示器和電源指示燈都會亮。我們還可以添加另外一些監(jiān)聽器,比如,硬盤會轉(zhuǎn)等。。。只需實現(xiàn)listner接口以及添加到computer的監(jiān)聽列表即可。。。
(最近回過頭來看java的一些基礎(chǔ)的東西,看swing的時候,突然很想知道observer模式到底是則么實現(xiàn)的,研究了一下,看了一些源碼,有了些心得,就順便寫出來
假設(shè)有一臺電腦。電腦里面有一個事件,當你按下電源按鈕的時候,那么顯示器會亮,電源指示燈也會亮。
Examda提示:這是典型的一個類似于GUI中按鈕事件模擬。
我們來分析一下需要幾個類
電腦肯定是需要的,我們得出Computer類。Computer類內(nèi)部有一個按電源按鈕的動作,我們叫做clickButton.這個事件我們叫做EventPowerOn.于是得出了EventPowerOn類。另外,對比GUI里面的button,他們都會添加監(jiān)聽器,所以應(yīng)該有個監(jiān)聽器類,我們叫做EventPowerOnListener。好到這里我們基本上找出了幾個必須的類Computer,EventPowerOn ,EventPowerOnListener
我們寫出他們的框架:
public class Computer implements Runnable{
public void clikButton(){}//該方法如果被調(diào)用,那么說明電源按鈕被按下
}
public class EventPowerOn {
private Object source;//事件的來源,也就是時間是由哪一個對象激發(fā)的
private long time;//這個屬性是隨意添加的 比如社么時候電源按鈕被按下
public EventPowerOn( long time, Object object) {
super();
this.source = object;
this.time = time;
}
public Object getObject() {
return source;
}
public void setObject(Object object) {
this.source = object;
}
public long getTime() {
return time;
}
public void setTime(long time) {
this.time = time;
}
}
public interface EventPowerOnListener {
public void performanceToPowerOn(EventPowerOn eventPowerOn);//改方法是電源按鈕被
//按后應(yīng)的響應(yīng)
}
Examda提示:剛才我們說,電源按鈕被按下,那么顯示器和電源指示器會變亮。那么顯示器和電源指示器應(yīng)該都另外做一個類
所以有:
public class Screen implements EventPowerOnListener{
public void performanceToPowerOn(EventPowerOn eventPowerOn) {
System.out.println(eventPowerOn.getTime());
System.out.println("Screen is on");
}
}
public class Light implements EventPowerOnListener{
public void performanceToPowerOn(EventPowerOn eventPowerOn) {
System.out.println(eventPowerOn.getTime());
System.out.println("power light is on");
}
}
為什么我們要用他們實現(xiàn)監(jiān)聽器類呢,因為對computer來說,他們都是監(jiān)聽器。一旦電源按鈕被按下,顯示器和電源指示器就應(yīng)該要有反應(yīng)。
那么如何將screen 和light添加進computer 呢。我們做如下的改動
public class Computer {
private List listeners=new ArrayList();
public void addEventPowerOnListener(EventPowerOnListener eventPowerOnListener)
{
listeners.add(eventPowerOnListener);
}
public void clikButton(){
for(EventPowerOnListener temp:listeners)
{
temp.performanceToPowerOn(new EventPowerOn(System.currentTimeMillis(),this) );
}
}
}
好了,一個模擬的例子就完成了。我們來測試一下:
public class testObserver {
public static void main(String[] args){
Computer computer=new Computer();
Screen screen=new Screen();
Light light=new Light();
computer.addEventPowerOnListener(screen);
computer.addEventPowerOnListener(light);
computer.click();
};
}
看戲結(jié)果:
1219215665656
Screen is on
1219215665656
power light is on
說明clickButton,那么顯示器和電源指示燈都會亮。我們還可以添加另外一些監(jiān)聽器,比如,硬盤會轉(zhuǎn)等。。。只需實現(xiàn)listner接口以及添加到computer的監(jiān)聽列表即可。。。
(最近回過頭來看java的一些基礎(chǔ)的東西,看swing的時候,突然很想知道observer模式到底是則么實現(xiàn)的,研究了一下,看了一些源碼,有了些心得,就順便寫出來