java設計模式--事件監聽器模式和觀察者模式
監聽器模式:事件源經過事件的封裝傳給監聽器,當事件源觸發事件後,監聽器接收到事件物件可以回撥事件的方法
觀察者模式:觀察者(Observer)相當於事件監聽者,被觀察者(Observable)相當於事件源和事件,執行邏輯時通知observer即可觸發oberver的update,同時可傳被觀察者和引數
監聽器模式demo
1、首要定義事件源物件(事件源相當於單擊按鈕事件當中的按鈕物件、屬於被監聽者):
- publicclass DemoSource {
- private Vector repository = new Vector();//監聽自己的監聽器佇列
- public
- publicvoid addDemoListener(DemoListener dl) {
- repository.addElement(dl);
- }
- publicvoid notifyDemoEvent() {//通知所有的監聽器
- Enumeration enum = repository.elements();
- while(enum.hasMoreElements()) {
- DemoListener dl = (DemoListener)enum
- dl.handleEvent(new DemoEvent(this));
- }
- }
- }
2、其次定義事件(狀態)物件(該事件物件包裝了事件源物件、作為引數傳遞給監聽器、很薄的一層包裝類):
- publicclass DemoEvent extends java.util.EventObject {
- public DemoEvent(Object source) {
- super(source);//source—事件源物件—如在介面上發生的點選按鈕事件中的按鈕
- //所有 Event 在構造時都引用了物件 "source",在邏輯上認為該物件是最初發生有關 Event 的物件
- }
- publicvoid say() {
- System.out.println("This is say method...");
- }
- }
3、最後定義我們的事件偵聽器介面如下
- publicinterface DemoListener extends java.util.EventListener {
- //EventListener是所有事件偵聽器介面必須擴充套件的標記介面、因為它是無內容的標記介面、
- //所以事件處理方法由我們自己宣告如下:
- publicvoid handleEvent(DemoEvent dm);
- }
監聽器實現類
- publicclass DemoListener1 implements DemoListener {
- publicvoid handleEvent(DemoEvent de) {
- System.out.println("Inside listener1...");
- de.say();//回撥
- }
- }
4、測試程式碼
- publicclass TestDemo {
- DemoSource ds;
- public TestDemo(){
- try{
- ds = new DemoSource();
- //將監聽器在事件源物件中登記:
- DemoListener1 listener1 = new DemoListener1();
- ds.addDemoListener(listener1);
- ds.addDemoListener(new DemoListener() {
- publicvoid handleEvent(DemoEvent event) {
- System.out.println("Method come from 匿名類...");
- }
- });
- ds.notifyDemoEvent();//觸發事件、通知監聽器
- }catch(Exception ex){
- ex.printStackTrace();
- }
- }
- publicstaticvoid main(String args[]) {
- new TestDemo();
- }
- }
觀察者模式demo
觀察者
- class Watcher implements java.util.Observer {
- publicvoid update(java.util.Observable obj, Object arg) {
- System.out.println("Update() called, count is "
- + ((Integer) arg).intValue());
- }
- }
被觀察者
- class BeingWatched extends java.util.Observable {
- void counter(int period) {
- for(; period<=0; period-- ) {
- setChanged();
- notifyObservers(new Integer(period));
- try {
- Thread.sleep(100);
- } catch( InterruptedException e) {
- System.out.println("Sleep interrupeted" );
- }
- }
- }
- };
測試
- publicclass ObserverDemo {
- publicstaticvoid main(String[] args) {
- BeingWatched beingWatched = new BeingWatched();//受查者
- Watcher watcher = new Watcher();//觀察者
- beingWatched.addObserver(watcher);
- beingWatched.counter(10);
- }
- }
原來這兩種api可以說都是基於:訂閱-釋出模式的事件/訊息通知模式,二者應該都算是“推”方式吧,就是被監控者將訊息通知給所有監控者。
1、訂閱:Observable.addObserver;
事件源.addDemoListener(這個方法是自己定義的)。
2、釋出:Observable需要兩步:setChanged()、notifyObservers(newValue); 事件源.notifyDemoEvent()(這個方法也是自己定義的)。
相關推薦
Java設計模式-回撥函式和觀察者模式
Android的框架中有非常多的地方使用了回撥的模式,例如Activity的生命週期,按鈕的點選事件等。 下面是回撥的基本模型: public class A { private CallBack callback; //註冊一個事件 public void reg
事件驅動模型和觀察者模式
你有一件事情,做這件事情的過程包含了許多職責單一的子過程。這樣的情況及其常見。當這些子過程有如下特點時,我們應該考慮設計一種合適的框架,讓框架來完成一些業務無關的事情,從而使得各個子過程的開發可以專注於自己的業務。 這些子過程有一定的執行次序; 這些子過程之間需要較靈活
java設計模式--事件監聽器模式和觀察者模式
監聽器模式:事件源經過事件的封裝傳給監聽器,當事件源觸發事件後,監聽器接收到事件物件可以回撥事件的方法 觀察者模式:觀察者(Observer)相當於事件監聽者,被觀察者(Observable)相當於事件源和事件,執行邏輯時通知observer即可觸發oberver的up
Java設計模式, 單例模式,工廠模式,建造者模式和觀察者模式
1、單例模式 寫法: 懶漢式 /** * 懶漢模式 * 宣告一個靜態物件,並且在第一次呼叫getInstance 方法時進行初始化 * Created by Bill on 2017/12
Java中的設計模式(七):觀察者模式
name int 還要 The else 意圖 http exceptio 所有 介紹 觀察者模式是行為設計模式之一。當您對對象的狀態感興趣並希望在有任何更改時收到通知時,觀察者設計模式非常有用。在觀察者模式中,監視另一個對象狀態的對象稱為Observer,正在被監視的對象
Java 設計模式(九)《觀察者模式》
觀察者模式 當物件間存在一對多關係時,則使用觀察者模式(Observer Pattern)。比如,當一個物件被修改時,則會自動通知它的依賴物件。觀察者模式屬於行為型模式。 所屬型別: 行為型 標籤: Java Gang Of Four Difficult
Java 使用動態代理和觀察者模式+threadlocal實現資料庫連線池
當我們使用資料庫連線池時,如果多執行緒連線資料庫時,當超過5個執行緒連線資料庫時,那麼在第6個執行緒包括之後就連線不到資料庫了,該怎麼處理。 這裡用了java動態代理來這裡用了java的動態代理來代理資料庫的連線,攔截連線的close方法。並且給代理的連線加上一
Java設計模式(十五)----觀察者模式
觀察者模式 一、定義 二、結構 具體案例 推模型和拉模型 三、Java提供的對觀察者模式的支援 Observer介面 Observable類 一、定義 觀察者模式是物件的行為模式,又叫釋出-訂閱(Publish/Subscribe)模式
用事件和觀察者模式解決經典面向物件題目:貓叫鼠跑人醒的題目
貓看到老鼠,叫一聲喵,老鼠聽到貓叫,撒腿就跑,主人被吵醒 分析: 看題目可知道有3個物件,老鼠,貓和人,他們的關聯就是貓叫-->老鼠跑-->主人被吵醒, 貓看到老鼠,激發了貓叫的事件 大致結構如下 public delegate v
Java的回撥函式和觀察者模式的區別
前一段時間研究了一下設計模式,突然想到觀察者模式和回撥函式之間的聯絡,網上也沒有什麼人說清楚,便自己又仔細想了想,便有了如下觀點,歡迎各位大神前來拍磚! 首先,先闡述一下網上說的,網上先說這是完全不同的兩種東西,介面回撥是觀察者模式的實現,後者是一種設計模式
設計模式學習(二)“觀察者模式” (C#)
original pan 學習筆記 pri 接口 program date contain 兩個 《深入淺出設計模式》學習筆記第二章 需求: 開發一套氣象監測應用,如圖: 氣象站,目前有三種裝置,溫度、濕度和氣壓感應裝置。 WeatherData對象追蹤氣象站的數據,並更
【pattern】設計模式(3) - Observer觀察者模式
獨立 使用 數據 技術 很多 調用 edi 基於 ace 源碼地址:https://github.com/vergilyn/design-patterns 另外一個大神很全的Github:https://github.com/iluwatar/java-design-pat
javaweb監聽器接口-觀察者模式
監聽器javaweb監聽器接口有8個分別是ServletRequestListener,HttpSessionListener,ServletContextListener, ServletRequestAttributeListener,HttpSessionAttributeListener,Servle
中介者模式和觀察者模式區別?
observer server serve 有一個 obs 交互 進行 強調 一個 中介者(mediator)強調的是同事(colleague)類之間的交互 而觀察者(observer)中的目標類(subject)強調是目標改變後對觀察者進行統一的通訊 兩者非常相同的一點就
23種設計模式(8):觀察者模式
println api pri 依次 move 類圖 bject 代碼實現 implement 定義:定義對象間一種一對多的依賴關系,使得當每一個對象改變狀態,則所有依賴於它的對象都會得到通知並自動更新。 類型:行為類模式。 類圖: 在軟件系統中經常會有這樣的需求:如
我與C++設計模式(十五)——觀察者模式
毋庸置疑,observer模式的地位是十分重要的,此處省略一些套話,那麼什麼是observer模式,他在幫我們解決什麼問題或者說他在面對什麼情形進行設計的。 observer模式要解決的問題是,建立一個一對多的依賴關係,並且做到當“一”變化的時候,“多”能夠及時作出相應的響
Android設計模式(十一)-觀察者模式
觀察者模式是一種使用頻率非常高的設計模式,最常用的地方就是訂閱-釋出系統。 這個模式的重要作用就是將觀察者和被觀察者解耦,使他們之間的依賴更小甚至沒有。 定義 定義物件一種一對多的依賴關係,使得每當一個物件改變狀態,則所有依賴於他的物件都會得到通知
Android設計模式原始碼解析之ListView觀察者模式
Android設計模式原始碼解析之觀察者模式 本文為 Android 設計模式原始碼解析 中 觀察者模式 分析 Android系統版本: 2.3 分析者:Mr.Simple,分析狀態:未完成,校對者:Mr.Simple,校對狀態:未開始
策略模式和觀察者模式
1.策略模式就是面向介面程式設計,定義了演算法族,分別封裝起來,讓它們之間可以相互替換,此模式讓演算法的變化獨立於使用演算法的客戶。 interface A{ int aaa(int a,int b); } class B implements A{ @Over
設計模式練習(17)——觀察者模式
觀察者模式 一、題目: 某公司欲開發一套機房監控系統,如果機房達到一定指定溫度,感測器將作出反應,將訊號傳遞給響應裝置,如警示燈將閃爍,報警器將發出警報,安全逃生門將自動開啟、隔熱門將自動關閉,每一響應裝置的行為右專門的程式來控制,為支援將來引入新型別的響