Java回調(diào)函數(shù)與觀察者模式實(shí)例代碼
本文研究的主要是Java回調(diào)函數(shù)與觀察者模式的實(shí)現(xiàn),具體介紹和實(shí)現(xiàn)代碼如下。
觀察者模式(有時(shí)又被稱為發(fā)布(publish )-訂閱(Subscribe)模式、模型-視圖(View)模式、源-收聽者(Listener)模式或從屬者模式)是軟件設(shè)計(jì)模式的一種。在此種模式中,一個(gè)目標(biāo)物件管理所有相依于它的觀察者物件,并且在它本身的狀態(tài)改變時(shí)主動(dòng)發(fā)出通知。這通常透過呼叫各觀察者所提供的方法來實(shí)現(xiàn)。此種模式通常被用來實(shí)現(xiàn)事件處理系統(tǒng)。
什么時(shí)候使用觀察者模式:
- 當(dāng)一個(gè)抽象模型有兩個(gè)方面, 其中一個(gè)方面依賴于另一方面。將這二者封裝在獨(dú)立的對(duì)象中以使它們可以各自獨(dú)立地改變和復(fù)用。
- 當(dāng)對(duì)一個(gè)對(duì)象的改變需要同時(shí)改變其它對(duì)象, 而不知道具體有多少對(duì)象有待改變。
- 當(dāng)一個(gè)對(duì)象必須通知其它對(duì)象,而它又不能假定其它對(duì)象是誰。換言之, 你不希望這些對(duì)象是緊密耦合的。
其實(shí)觀察者模式同前面講過的橋梁、策略有著共同的使用環(huán)境:將變化獨(dú)立封裝起來,以達(dá)到最大的重用和解耦。觀察者與后兩者不同的地方在于,觀察者模式中的目標(biāo)和觀察者的變化不是獨(dú)立的,而是有著某些聯(lián)系。
在Java中通過Observable類和Observer接口實(shí)現(xiàn)了觀察者模式。一個(gè)Observer對(duì)象監(jiān)視著一個(gè)Observable對(duì)象的變化,當(dāng)Observable對(duì)象發(fā)生變化時(shí),Observer得到通知,就可以進(jìn)行相應(yīng)的工作。
package com.demo.test;
import java.util.Observable;
import java.util.Observer;
//觀察者模式里面目標(biāo)類維護(hù)了所有觀察者的引用,而回調(diào)里面只是維護(hù)了一個(gè)引用
public class ObserverCallbackDemo {
// 觀察者A
static class ConcreteObserverA implements Observer {
@Override
public void update(Observable o, Object arg) {
System.out.println("ConcreteObserverA update");
}
}
// 觀察者B
static class ConcreteObserverB implements Observer {
@Override
public void update(Observable o, Object arg) {
System.out.println("ConcreteObserverB update");
}
}
// 被觀察對(duì)象
static class ConcreteObservable extends Observable {
public void changeValue() {
//protected方法只能在子類被調(diào)用
setChanged();
notifyObservers();
}
}
// 回調(diào)函數(shù)接口
interface ICallback {
public void onCall();
}
// 回調(diào)類
static class CallbackDemo {
private ICallback callback;
public void setListener(ICallback callback) {
this.callback = callback;
}
public void call() {
callback.onCall();
}
}
public static void main(String[] args) {
// 觀察者
ConcreteObserverA observerA = new ConcreteObserverA();
ConcreteObserverB observerB = new ConcreteObserverB();
ConcreteObservable observable = new ConcreteObservable();
observable.addObserver(observerA);
observable.addObserver(observerB);
System.out.println("countObservers = " + observable.countObservers());
observable.changeValue();
// 回調(diào)函數(shù)
CallbackDemo callbackDemo = new CallbackDemo();
callbackDemo.setListener(new ICallback() {
@Override
public void onCall() {
System.out.println("callback onCall");
}
}
);
callbackDemo.call();
}
}
輸出結(jié)果:
countObservers = 2
ConcreteObserverB update
ConcreteObserverA update
callback onCall
總結(jié)
從上面代碼可以看出:回調(diào)函數(shù)應(yīng)該屬于觀察者模式的一種,目的是為了替代輪循機(jī)制,將組件之間的耦合性降低。觀察者模式里面目標(biāo)類維護(hù)了所有觀察者的引用,而回調(diào)里面只是維護(hù)了一個(gè)引用。
以上就是本文關(guān)于Java回調(diào)函數(shù)與觀察者模式實(shí)例代碼的全部內(nèi)容,希望對(duì)大家有所幫助。感興趣的朋友可以繼續(xù)參閱本站其他相關(guān)專題,如有不足之處,歡迎留言指出。感謝朋友們對(duì)本站的支持!
相關(guān)文章
Springboot校驗(yàn)工具類詳細(xì)代碼示例
這篇文章主要給大家介紹了關(guān)于Springboot校驗(yàn)工具類的相關(guān)資料,工具類里面主要是封裝了一些常用字段驗(yàn)證方法,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下2024-02-02
springboot整合ehcache 實(shí)現(xiàn)支付超時(shí)限制的方法
在線支付系統(tǒng)需要極高的穩(wěn)定性,在有限的系統(tǒng)資源下,穩(wěn)定性優(yōu)先級(jí)要高于系統(tǒng)并發(fā)以及用戶體驗(yàn),因此需要合理的控制用戶的支付請(qǐng)求。下面通過本文給大家介紹springboot整合ehcache 實(shí)現(xiàn)支付超時(shí)限制的方法,一起看看吧2018-01-01
mybatis-plus自動(dòng)填充插入更新時(shí)間有8小時(shí)時(shí)差
本文主要介紹了mybatis-plus自動(dòng)填充插入更新時(shí)間有8小時(shí)時(shí)差,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-09-09
java 反射 動(dòng)態(tài)調(diào)用不同類的靜態(tài)方法(推薦)
下面小編就為大家?guī)硪黄狫AVA 反射 動(dòng)態(tài)調(diào)用不同類的靜態(tài)方法(推薦)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2016-08-08
Java阻塞隊(duì)列中的BlockingQueue接口詳解
這篇文章主要介紹了Java阻塞隊(duì)列中的BlockingQueue接口詳解,對(duì)于Queue而言,BlockingQueue是主要的線程安全的版本,具有阻塞功能,可以允許添加、刪除元素被阻塞,直到成功為止,BlockingQueue相對(duì)于Queue而言增加了兩個(gè)方法put、take元素,需要的朋友可以參考下2023-09-09
解決springboot項(xiàng)目打成jar包后運(yùn)行時(shí)碰到的小坑
這篇文章主要介紹了解決springboot項(xiàng)目打成jar包后運(yùn)行時(shí)碰到的小坑,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-02-02
Springboot的spring-boot-maven-plugin導(dǎo)入失敗的解決方案
這篇文章主要介紹了Springboot的spring-boot-maven-plugin導(dǎo)入失敗的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-07-07

