日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

观察者模式与事件处理

發布時間:2024/1/18 编程问答 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 观察者模式与事件处理 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

觀察者模式簡介

觀察者模式用于建立對象之間一對多的依賴關系,當一個對象狀態發生改變,其他對象得到通知并做出響應。在觀察者模式中,我們將狀態發生改變的對象稱為觀察目標,將被通知的對象稱為觀察者。

觀察者模式中包括四大核心要素:觀察目標、觀察者、具體目標、具體觀察者。

  • 觀察目標:也稱主題,可以是接口、抽象類或具體類,定義和實現了觀察者集合和對觀察者添加、移除方法,聲明了抽象通知方法。
  • 觀察者:也稱抽象觀察者,可以為接口或抽象類,聲明了狀態更新方法。
  • 具體目標:觀察目標的子類,定義了目標包含狀態,實現了觀察目標通知方法的抽象業務邏輯。
  • 具體觀察者:觀察者的實現類,包含了具體目標的引用,實現了觀察者定義的狀態更新方法。

以下這段代碼是對觀察者模式結構的簡要說明:

  • 觀察目標——Subject
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(); }
  • 觀察者——Observer
public interface Observer {void update(); }
  • 具體目標——ConcreteSubject
public class ConcreteSubject extends Subject{private String subjectState;public String getSubjectState() {return subjectState;}public void setSubjectState(String subjectState) {this.subjectState = subjectState;}@Overridepublic void notifyObservers(){for (Observer obj:observerList){obj.update();}} }
  • 具體觀察者——ConcreteObserver
public class ConcreteObserver implements Observer{@Overridepublic void update() {System.out.println(this.toString()+"狀態更新了!");} }
  • 代碼測試——TestObserver
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();} }

模式應用實例

需求:聯機對戰游戲中,多個玩家同時加入一個戰隊。當戰隊中的某一隊員收到敵人攻擊時將通知其他隊友并做出響應。

  • 觀察目標——GameCenter
/*** 指揮中心* */ 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()+"加入戰隊");playerList.add(player);}public void removePlayer(GamePlayer player){System.out.println(player.getName()+"退出戰隊");if (!playerList.isEmpty()) {playerList.remove(player);}}public String getCenterName() {return centerName;}public void setCenterName(String centerName) {this.centerName = centerName;} }
  • 觀察者——GamePlayer
/*** 游戲玩家* */ 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;} }
  • 客戶端——TestObserverSub
public class TestObserverSub {public static void main(String[] args) {GameCenter center = new GameCenter("西游戰隊");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),即一個組件所引發的事件委派給事件處理對象負責。

在 DEM 模型中,目標角色負責發布事件,而觀察者可以向目標訂閱其所感興趣的事件。我們將事件的發布者稱為事件源,訂閱者稱為事件監聽器,過程中通過事件對象來傳遞事件相關信息。事件源、事件監聽器、事件對象構成了 Java 事件處理模型的三要素。事件源充當觀察目標,事件監聽器充當觀察者,事件在目標和觀察者之間傳遞數據。

以下代碼是 DEM 的簡化模型:

  • 事件對象——Event
/*** 自定義事件對象* */ 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;}}
  • 觀察者事件監聽器——EventListener
/*** 自定義事件監聽器* */ public interface EventListener {void onEvent(Event event); }
  • 觀察目標事件源——EventSource
/*** 自定義事件源* */ 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;} }
  • 客戶端——TestDemo
public class TestDemo {public static void main(String[] args) {//創建一個事件源EventSource source = new EventSource("SOURCE");//設置監聽器source.setListener(new EventListener() {@Overridepublic void onEvent(Event event) {System.out.println(event.getEventName()+"被觸發!");}});//觸發一個點擊事件source.fireEvent(new Event("clickEvent"));}}

參考書籍:《Java設計模式》/ 劉偉 編著 | 清華大學出版社

總結

以上是生活随笔為你收集整理的观察者模式与事件处理的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。