最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java回調(diào)函數(shù)與觀察者模式實(shí)例代碼

 更新時(shí)間:2018年02月01日 14:41:55   作者:司馬懿字仲達(dá)  
這篇文章主要介紹了Java回調(diào)函數(shù)與觀察者模式實(shí)例代碼,簡單介紹了使用觀察者模式的場景,分享了相關(guān)代碼示例,小編覺得還是挺不錯的,具有一定借鑒價(jià)值,需要的朋友可以參考下

本文研究的主要是Java回調(diào)函數(shù)與觀察者模式的實(shí)現(xiàn),具體介紹和實(shí)現(xiàn)代碼如下。

觀察者模式(有時(shí)又被稱為發(fā)布(publish )-訂閱(Subscribe)模式、模型-視圖(View)模式、源-收聽者(Listener)模式或從屬者模式)是軟件設(shè)計(jì)模式的一種。在此種模式中,一個目標(biāo)物件管理所有相依于它的觀察者物件,并且在它本身的狀態(tài)改變時(shí)主動發(fā)出通知。這通常透過呼叫各觀察者所提供的方法來實(shí)現(xiàn)。此種模式通常被用來實(shí)現(xiàn)事件處理系統(tǒng)。

什么時(shí)候使用觀察者模式:

  1. 當(dāng)一個抽象模型有兩個方面, 其中一個方面依賴于另一方面。將這二者封裝在獨(dú)立的對象中以使它們可以各自獨(dú)立地改變和復(fù)用。
  2. 當(dāng)對一個對象的改變需要同時(shí)改變其它對象, 而不知道具體有多少對象有待改變。
  3. 當(dāng)一個對象必須通知其它對象,而它又不能假定其它對象是誰。換言之, 你不希望這些對象是緊密耦合的。

其實(shí)觀察者模式同前面講過的橋梁、策略有著共同的使用環(huán)境:將變化獨(dú)立封裝起來,以達(dá)到最大的重用和解耦。觀察者與后兩者不同的地方在于,觀察者模式中的目標(biāo)和觀察者的變化不是獨(dú)立的,而是有著某些聯(lián)系。

在Java中通過Observable類和Observer接口實(shí)現(xiàn)了觀察者模式。一個Observer對象監(jiān)視著一個Observable對象的變化,當(dāng)Observable對象發(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ù)了一個引用
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");
		}
	}
	// 被觀察對象
	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ù)了一個引用。

以上就是本文關(guān)于Java回調(diào)函數(shù)與觀察者模式實(shí)例代碼的全部內(nèi)容,希望對大家有所幫助。感興趣的朋友可以繼續(xù)參閱本站其他相關(guān)專題,如有不足之處,歡迎留言指出。感謝朋友們對本站的支持!

相關(guān)文章

  • spring 重復(fù)注解和aop攔截的實(shí)現(xiàn)示例

    spring 重復(fù)注解和aop攔截的實(shí)現(xiàn)示例

    本文主要介紹了spring 重復(fù)注解和aop攔截的實(shí)現(xiàn)示例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-08-08
  • 利用Java生成帶有文字的二維碼

    利用Java生成帶有文字的二維碼

    二維碼在我們現(xiàn)在的生活中可謂是隨處可見,這篇文章主要是介紹如何利用Java生成帶有文字的二維碼,對大家學(xué)習(xí)Java具有一定的參考借鑒價(jià)值。有需要的朋友們下面來一起看看吧。
    2016-09-09
  • java爬蟲之使用HttpClient模擬瀏覽器發(fā)送請求方法詳解

    java爬蟲之使用HttpClient模擬瀏覽器發(fā)送請求方法詳解

    這篇文章主要介紹了java爬蟲之使用HttpClient模擬瀏覽器發(fā)送請求方法詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-07-07
  • Netty分布式ByteBuf使用命中緩存的分配解析

    Netty分布式ByteBuf使用命中緩存的分配解析

    這篇文章主要為大家介紹了Netty分布式ByteBuf?使用命中緩存的分配解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-03-03
  • java內(nèi)部類的最詳細(xì)詳解

    java內(nèi)部類的最詳細(xì)詳解

    內(nèi)部類是指在一個外部類的內(nèi)部再定義一個類,下面這篇文章主要給大家介紹了關(guān)于java內(nèi)部類的最詳細(xì)詳解,文中通過圖文介紹的非常詳細(xì),需要的朋友可以參考下
    2022-06-06
  • Spring復(fù)雜對象創(chuàng)建的方式小結(jié)

    Spring復(fù)雜對象創(chuàng)建的方式小結(jié)

    這篇文章主要介紹了Spring復(fù)雜對象創(chuàng)建的三種方式,現(xiàn)在使用Spring如何創(chuàng)建這種類型的對象?Spring中提供了三種方法來創(chuàng)建復(fù)雜對象,需要的朋友可以參考下
    2022-01-01
  • java 用itext設(shè)置pdf紙張大小操作

    java 用itext設(shè)置pdf紙張大小操作

    這篇文章主要介紹了java 用itext設(shè)置pdf紙張大小操作,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-01-01
  • java web激活郵箱并找回密碼

    java web激活郵箱并找回密碼

    這篇文章主要介紹了java web激活郵箱并找回密碼,在項(xiàng)目中要實(shí)現(xiàn)用戶注冊的郵箱激活以及忘記密碼重置密碼功能,感興趣的小伙伴們
    2015-11-11
  • 解決RestTemplate 的getForEntity調(diào)用接口亂碼的問題

    解決RestTemplate 的getForEntity調(diào)用接口亂碼的問題

    這篇文章主要介紹了解決RestTemplate 的getForEntity調(diào)用接口亂碼的問題,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-08-08
  • Gateway集成Netty服務(wù)的配置加載詳解

    Gateway集成Netty服務(wù)的配置加載詳解

    這篇文章主要為大家介紹了Gateway集成Netty服務(wù)的配置加載詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-02-02

最新評論

通许县| 惠水县| 北宁市| 瑞丽市| 黄浦区| 潞西市| 新乡市| 彝良县| 庆安县| 奎屯市| 丹寨县| 莲花县| 泸水县| 永兴县| 海丰县| 庄浪县| 新闻| 太仓市| 石家庄市| 巢湖市| 祁东县| 子洲县| 昌都县| 工布江达县| 永登县| 公安县| 雅安市| 梓潼县| 普兰店市| 集贤县| 湛江市| 怀来县| 彭泽县| 珲春市| 涿州市| 年辖:市辖区| 丰镇市| 金秀| 兴城市| 临颍县| 雷山县|