首頁  >  文章  >  Java  >  從零開始理解JAVA事件處理機制

從零開始理解JAVA事件處理機制

巴扎黑
巴扎黑原創
2017-06-23 16:37:251191瀏覽

「事件」這個詞已經被濫用了。正因為「事件」的被濫用,很多人在用到事件的時候不求甚解,依樣畫葫蘆,導致學習工作了很多年,還是不清楚什麼是事件處理器、什麼是事件持有者。所以,如果你對於Event這個字還是心存恐懼,那麼本文正是你所需要的。讓我們從易到難,從具體到抽象,一步一步解釋java事件處理機制。

一:觀察者模式

要了解事件和監聽,我們首先來必須要了解觀察者模式。

什麼是觀察者模式,我們先來看一個熟悉的場景:

#1:教師佈置作業,通知學生;

2:學生觀察到老師佈置了作業,開始做作業;

首先我明確下,我歷來是十分反對以阿貓阿狗、老師學生這樣的場景來闡述代碼問題的,所以主題的最後肯定會回到實際代碼中。言歸正傳,在這個場景中,學生就是觀察者,教師就是被觀察者,但是大家一定要注意:

教師作為被觀察者,實際上是掌握著主動的,且看上文中我加粗的「通知」二字,因為這貌似看上去簡簡單單的通知,事實上卻要做很多事情(寫很多程式碼)。

好了,我們先來實現上面的場景:

從零開始理解JAVA事件處理機制

#程式碼:

觀察者,學生

package com.zuikc.events;

import java.util.Observable;

public class Student implements java.util.Observer {

    private String name;
    public Student(String name){
        this.name = name;
    }
    @Override
    public void update(Observable o, Object arg) {
        Teacher teacher = (Teacher) o;
        System.out.printf("學生%s觀察到(實際上是被通知)%s佈置了作業《%s》 \n", this.name, teacher.getName(), arg );
    }

}

被觀察者,教師

package com.zuikc.events;

import java.util.*;

public class Teacher extends java.util.Observable {

    private String name;
    private List<String> homeworksworksworks

    private List<String> homeworksworks" getName() {

        return this.name;
    }

    public Teacher(String name) {

     ;
    }

    public void setHomework(String homework) {

        System.out.printf("%s佈置了作業 %s \n", this.name, homework.out.printf("%s佈置了作業 %s \n", this.name, homework);

homeworks.add(homework);
        setChanged();
        notifyObservers(homework);

#  #客戶端:


package com.zuikc.events;

public class Client {

    public static void main(String[] args) {
Student student1= new Student("張三");

        Student student2 = new Student("李四");

        Teacher teacher1 = newcher("zuikc")11 ;
        teacher1.addObserver(student2);

        teacher1.setHomework("事件機制第一天作業");

    }










#########################################H學者有個錯覺,考慮“觀察”這個動作是主動的,所以就認為在代碼實現上,Reader是主動調用自己的update,但是很遺憾,當然不是,在代碼實現上,update是“被觀察者” Teacher主動調用的。有人說,我只在Teacher中看到了#########        setChanged();###        notifyObservers(homework);#########沒有看到它呼叫查看它的父類別Observable,在notifyObservers方法中有,#########for (int i = arrLocal.length-1; i>=0; i--)###    ((Observer)arrLocal [i]).update(this, arg);###

看看結果吧:

從零開始理解JAVA事件處理機制

注意,以上程式碼中,我直接使用了java.util套件中的類別Observable和介面Observer,我們當然也可以自己寫這兩個東東。

 

二:基礎版觀察者模式

#初學者對於一上來就使用java.util中的api不習慣,可能覺得看不到摸不著,那我們就自己來寫一個基礎版的觀察者模式,大家感受下,在寫的過程中,一定要對照上節中的UML圖和代碼,然後心中默念:它們沒有區別,它們沒有差別!

上圖:

從零開始理解JAVA事件處理機制

上程式碼:

#觀察者,介面

package com.zuikc ;

public interface Observer {

    void update(Observable o);
}

具體觀察者,我寫了兩個:

class ConcreteObserver1 implements Observer {

    public void update(Observable o) {
        System.out.println("觀察者1觀察到" + o.getClass().getSimpleName( ) + "發生變化");
        System.out.println("觀察者1做出回應");
    }
}

class ConcreteObserver2 implements Observer {

##}


class ConcreteObserver2 implements Observer {

    public void update(Observable o) {
        System.out.println("觀察者2觀察到" + o.getClass().getSimpleName() + "發生變化");##   println("觀察者2回應");

    }
}

#觀察者

##package com.zuikc;


import java.util.ArrayList;

import java.util.List;

public class Observable {

    List observers = new ArrayList();


    public void addObserver(Observer o) {
        observers.add(o);

    }


    public void doSS.被觀察者,我改變了");
        // 主動去通知所有的觀察者
        notifyObservers();
    }

# (Observer observer : observers) {

            observer.update(this);
       package com.zuikc;

public class Client {

    public static void main(String[] args) {

        Observable observable = new Observable();##O    new ConcreteObserver1());
        observable.addObserver(new ConcreteObserver2());

        observable.doSomething#)自己運行下程式碼,看看發生了什麼事。

在上面程式碼中,我們自己了一個接口,一個被觀察者類,雖然簡單了一點,但是卻達到了演示的效果。當然,我們也可以原封不動的把JDK中的原始碼拷貝出來當作我們這兩個檔案的程式碼。

如果對於上面的程式碼已經相當之熟悉,你還可以研究下update方法,在第一小節中我們是帶了arg參數的,但是這個基礎版本中沒帶。無所謂,你想帶就帶,不想帶就不想帶,程式碼就是自由,只要你實現了功能。

 



三:觀察者模式的用意


基礎版的觀察者模式畢竟太簡單,在我們第一節中的程式碼中,我們可以總結出:

1:教師類和學生類無關,他只依賴觀察者接口,如果有一天,他的作業不僅僅佈置給學生,作為優秀講師,還要發送給全校的老師作為參考,那麼只要老師這個類別也實現觀察者接口,我們同樣可以將老師添加到這個教師的觀察者列表中;

2:觀察者模式分離了觀察者和被觀察者自身的責任,讓類別各自維護自己的功能,提高了系統的可重用性;

3:觀察看起來是一個主動的行為,但是其實觀察者不是主動調用自己的業務代碼的,相反,是被觀察者調用的。所以,觀察者模式還有另一個名字,叫發布-訂閱模式,我認為,後者更貼切;

 

觀察者模式還有另一種形態,就是事件驅動模型,這兩種方式在實現機制上是非常接近的,在理解了觀察者模式的基礎上,理解事件驅動,就非常簡單了。

以上是從零開始理解JAVA事件處理機制的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn