生活随笔
收集整理的這篇文章主要介紹了
观察者模式与事件处理
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
觀察者模式簡介
觀察者模式用于建立對象之間一對多的依賴關(guān)系,當一個對象狀態(tài)發(fā)生改變,其他對象得到通知并做出響應(yīng)。在觀察者模式中,我們將狀態(tài)發(fā)生改變的對象稱為觀察目標,將被通知的對象稱為觀察者。
觀察者模式中包括四大核心要素:觀察目標、觀察者、具體目標、具體觀察者。
觀察目標:也稱主題,可以是接口、抽象類或具體類,定義和實現(xiàn)了觀察者集合和對觀察者添加、移除方法,聲明了抽象通知方法。 觀察者:也稱抽象觀察者,可以為接口或抽象類,聲明了狀態(tài)更新方法。 具體目標:觀察目標的子類,定義了目標包含狀態(tài),實現(xiàn)了觀察目標通知方法的抽象業(yè)務(wù)邏輯。 具體觀察者:觀察者的實現(xiàn)類,包含了具體目標的引用,實現(xiàn)了觀察者定義的狀態(tài)更新方法。
以下這段代碼是對觀察者模式結(jié)構(gòu)的簡要說明:
public abstract class Subject { protected List < Observer > observerList
; Subject ( ) { observerList
= new ArrayList < > ( ) ; } protected void addObserver ( Observer observer
) { observerList
. add ( observer
) ; } protected void removeObserver ( Observer observer
) { if ( ! observerList
. isEmpty ( ) ) { observerList
. remove ( observer
) ; } } public abstract void notifyObservers ( ) ;
}
public interface Observer { void update ( ) ;
}
public class ConcreteSubject extends Subject { private String subjectState
; public String getSubjectState ( ) { return subjectState
; } public void setSubjectState ( String subjectState
) { this . subjectState
= subjectState
; } @Override public void notifyObservers ( ) { for ( Observer obj
: observerList
) { obj
. update ( ) ; } }
}
public class ConcreteObserver implements Observer { @Override public void update ( ) { System . out
. println ( this . toString ( ) + "狀態(tài)更新了!" ) ; }
}
public class TestObserver { public static void main ( String [ ] args
) { Subject subject
= new ConcreteSubject ( ) ; for ( int i
= 0 ; i
< 3 ; i
++ ) { subject
. addObserver ( new ConcreteObserver ( ) ) ; } subject
. notifyObservers ( ) ; }
}
模式應(yīng)用實例
需求:聯(lián)機對戰(zhàn)游戲中,多個玩家同時加入一個戰(zhàn)隊。當戰(zhàn)隊中的某一隊員收到敵人攻擊時將通知其他隊友并做出響應(yīng)。
public class GameCenter { private String centerName
; List < GamePlayer > playerList
; public GameCenter ( ) { playerList
= new ArrayList < > ( ) ; } public GameCenter ( String groupName
) { this . centerName
= groupName
; playerList
= new ArrayList < > ( ) ; } public void notifyPlayers ( String name
) { System . out
. println ( centerName
+ "緊急通知,盟友" + name
+ "遭受敵人攻擊,請火速支援" ) ; for ( GamePlayer player
: playerList
) { if ( ! player
. getName ( ) . equals ( name
) ) { player
. help ( ) ; } } } ; public void addPlayer ( GamePlayer player
) { System . out
. println ( player
. getName ( ) + "加入戰(zhàn)隊" ) ; playerList
. add ( player
) ; } public void removePlayer ( GamePlayer player
) { System . out
. println ( player
. getName ( ) + "退出戰(zhàn)隊" ) ; if ( ! playerList
. isEmpty ( ) ) { playerList
. remove ( player
) ; } } public String getCenterName ( ) { return centerName
; } public void setCenterName ( String centerName
) { this . centerName
= centerName
; }
}
public class GamePlayer { private String name
; public GamePlayer ( String name
) { this . name
= name
; } public void beAttacked ( GameCenter center
) { System . out
. println ( name
+ "遭受攻擊,請求支援請求支援!" ) ; center
. notifyPlayers ( name
) ; } ; public void help ( ) { System . out
. println ( name
+ "收到!火速前往支援!" ) ; } ; public String getName ( ) { return name
; } public void setName ( String name
) { this . name
= name
; }
}
public class TestObserverSub { public static void main ( String [ ] args
) { GameCenter center
= new GameCenter ( "西游戰(zhàn)隊" ) ; GamePlayer wuKong
= new GamePlayer ( "齊天大圣-孫悟空" ) ; GamePlayer baJie
= new GamePlayer ( "天蓬元帥-豬八戒" ) ; GamePlayer wuJin
= new GamePlayer ( "卷簾大將-沙悟凈" ) ; center
. addPlayer ( wuKong
) ; center
. addPlayer ( baJie
) ; center
. addPlayer ( wuJin
) ; wuJin
. beAttacked ( center
) ; }
}
輸出:
Java 事件處理
Java 的事件處理模型采用了基于觀察者模式的委派事件模型(DEM),即一個組件所引發(fā)的事件委派給事件處理對象負責(zé)。
在 DEM 模型中,目標角色負責(zé)發(fā)布事件,而觀察者可以向目標訂閱其所感興趣的事件。我們將事件的發(fā)布者稱為事件源,訂閱者稱為事件監(jiān)聽器,過程中通過事件對象來傳遞事件相關(guān)信息。事件源、事件監(jiān)聽器、事件對象構(gòu)成了 Java 事件處理模型的三要素。事件源充當觀察目標,事件監(jiān)聽器充當觀察者,事件在目標和觀察者之間傳遞數(shù)據(jù)。
以下代碼是 DEM 的簡化模型:
public class Event { private String eventName
; public Event ( ) { } public Event ( String eventName
) { this . eventName
= eventName
; } public String getEventName ( ) { return eventName
; } public void setEventName ( String eventName
) { this . eventName
= eventName
; } }
觀察者事件監(jiān)聽器——EventListener
public interface EventListener { void onEvent ( Event event
) ;
}
public class EventSource { private String sourceName
; private Event event
; private EventListener listener
; public void fireEvent ( Event event
) { this . event
= event
; listener
. onEvent ( event
) ; } public EventSource ( ) { } public EventSource ( String sourceName
) { this . sourceName
= sourceName
; } public EventSource ( EventListener listener
) { this . listener
= listener
; } public String getSourceName ( ) { return sourceName
; } public void setSourceName ( String sourceName
) { this . sourceName
= sourceName
; } public EventListener getListener ( ) { return listener
; } public void setListener ( EventListener listener
) { this . listener
= listener
; } public Event getEvent ( ) { return event
; } public void setEvent ( Event event
) { this . event
= event
; }
}
public class TestDemo { public static void main ( String [ ] args
) { EventSource source
= new EventSource ( "SOURCE" ) ; source
. setListener ( new EventListener ( ) { @Override public void onEvent ( Event event
) { System . out
. println ( event
. getEventName ( ) + "被觸發(fā)!" ) ; } } ) ; source
. fireEvent ( new Event ( "clickEvent" ) ) ; } }
參考書籍:《Java設(shè)計模式》/ 劉偉 編著 | 清華大學(xué)出版社
總結(jié)
以上是生活随笔 為你收集整理的观察者模式与事件处理 的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔 網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔 推薦給好友。