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

詳談Java編程之委托代理回調(diào)、內(nèi)部類(lèi)以及匿名內(nèi)部類(lèi)回調(diào)(閉包回調(diào))

 更新時(shí)間:2017年05月23日 10:06:38   投稿:jingxian  
下面小編就為大家?guī)?lái)一篇詳談Java編程之委托代理回調(diào)、內(nèi)部類(lèi)以及匿名內(nèi)部類(lèi)回調(diào)(閉包回調(diào))。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧

最近一直在看Java的相關(guān)東西,因?yàn)槲覀冊(cè)趇OS開(kāi)發(fā)是,無(wú)論是Objective-C還是Swift中,經(jīng)常會(huì)用到委托代理回調(diào),以及Block回調(diào)或者說(shuō)是閉包回調(diào)。接下來(lái)我們就來(lái)看看Java語(yǔ)言中是如何實(shí)現(xiàn)委托代理回調(diào)以及閉包回調(diào)的。當(dāng)然這兩個(gè)技術(shù)點(diǎn)雖然實(shí)現(xiàn)起來(lái)并不困難,但是,這回調(diào)在封裝一些公用組件時(shí)還是特別有用的。所以今天,還是有必要把Java中的委托代理回調(diào)以及閉包回調(diào)來(lái)單獨(dú)的拿出來(lái)聊一下。

本篇博客我們依然依托于實(shí)例,先聊聊委托代理回調(diào)的實(shí)現(xiàn)和使用場(chǎng)景,然后再聊一下使用匿名內(nèi)部類(lèi)來(lái)進(jìn)行回調(diào),其實(shí)就是我們常說(shuō)的“閉包”回調(diào)。閉包回調(diào)的實(shí)現(xiàn)方式其實(shí)就是匿名內(nèi)部類(lèi)的使用。既然本篇博客我們使用到了匿名內(nèi)部類(lèi),我們就再聊一下Java中的內(nèi)部類(lèi)的相關(guān)東西。

一、委托代理回調(diào)

在iOS開(kāi)發(fā)中,我們經(jīng)常使用到委托代理回調(diào),想TableView、CollectionView等等,這些高級(jí)控件會(huì)依賴(lài)于委托回調(diào)來(lái)完成一些配置。當(dāng)然在Java中委托代理回調(diào)也是非常有用的,接下來(lái)我們就來(lái)看一下Java中的委托代理回調(diào)。當(dāng)然在Swift或者OC中的委托代理回調(diào)是依托于“協(xié)議”的,Swift或者OC中的“協(xié)議”其實(shí)就是Java語(yǔ)言中的“接口”。所以在Java中的委托代理回調(diào),依然要依托于“接口”來(lái)實(shí)現(xiàn)。

1、類(lèi)圖

首先我們給出該部分實(shí)例的類(lèi)圖,然后我們根據(jù)下方的類(lèi)圖來(lái)設(shè)計(jì)實(shí)現(xiàn)我們的具體代碼。下方就是本部分所設(shè)計(jì)Demo的類(lèi)圖,當(dāng)然,從類(lèi)圖中我們也能直觀的看到,該示例是比較簡(jiǎn)單的,一共也就是一個(gè)接口兩個(gè)類(lèi)。CustomDelegate這個(gè)接口是代理類(lèi)要實(shí)現(xiàn)的接口,其中包含了代理類(lèi)要實(shí)現(xiàn)的方法。

從下方的類(lèi)圖中我們可以看出,代理類(lèi)FirstClass實(shí)現(xiàn)了CustomDelegate代理接口,并實(shí)現(xiàn)了相關(guān)的代理方法。而SecondClass依賴(lài)于CustomDelegate接口,也就是說(shuō)只要是實(shí)現(xiàn)了CustomDelegate接口的類(lèi)都可以作為SecondClass的代理。而FirstClass中含有SecondClass類(lèi)型的屬性,并且FirstClass又實(shí)現(xiàn)了CustomDelegate接口,在FirstClass中,我們將secondClass對(duì)象的代理類(lèi)指定為FirstClass,稍后我們?cè)诰唧w實(shí)現(xiàn)時(shí)將會(huì)介紹到。

  

2、代碼的具體實(shí)現(xiàn)

根據(jù)上述類(lèi)圖,我們很容易的就可以給出相應(yīng)的代碼實(shí)現(xiàn)。接下來(lái)我們就根據(jù)上述類(lèi)圖來(lái)給出具體的代碼實(shí)現(xiàn)。

(1)、CustomDelegate的代碼實(shí)現(xiàn)

下方代碼段就是CustomDelegate的具體實(shí)現(xiàn)。當(dāng)然該接口的實(shí)現(xiàn)比較簡(jiǎn)單,就一個(gè)setValue(String value)方法。該方法的具體作用是用來(lái)相應(yīng)參數(shù)回調(diào)的。下方我們會(huì)用到該方法。

package com.zeluli.callback.delegate;

public interface CustomDelegate {
  public void setValue(String value);
}

(2)、SecondClass的代碼實(shí)現(xiàn)

CustomDelegate實(shí)現(xiàn)完畢后,接下來(lái)我們就來(lái)實(shí)現(xiàn)一下SecondClass的具體代碼。下方代碼段就是SecondClass的具體代碼實(shí)現(xiàn)了。我們從具體實(shí)現(xiàn)中可以明確看出,SecondClass類(lèi)中有個(gè)私有的delegate屬性,該屬性是CustomDelegate類(lèi)型的,所以SecondClass依賴(lài)于CustomDelegate類(lèi)型。

在SecondClass的構(gòu)造方法中,我們?yōu)閐elegate指定了具體的對(duì)象,然后調(diào)用了begin()方法。begin()方法中做的事情也是比較簡(jiǎn)單的,就是使用了Java中自帶的定時(shí)器,然后在特定時(shí)間的間隔中執(zhí)行delegate對(duì)象的setValue()方法,并且將當(dāng)前的時(shí)間傳給setValue()方法。

package com.zeluli.callback.delegate;

import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Timer;
import java.util.TimerTask;

public class SecondClass {
  private CustomDelegate delegate;

  public SecondClass(CustomDelegate delegate) {
    this.delegate = delegate;
    this.begin();
  }
  
  public void begin() {
    TimerTask task = new TimerTask() {
      @Override
      public void run() {
        delegate.setValue(getNowDate());  //執(zhí)行委托代理回調(diào)方法
      }
    };
    
    long delay = 0; 
    Timer timer = new Timer(); 
    timer.scheduleAtFixedRate(task, delay, 1000); 
  }
  
  private String getNowDate() {
    Date currentTime = new Date();
    SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    String dateString = formatter.format(currentTime);
    return dateString;
  }
}

(3)、FirstClass的創(chuàng)建

接下來(lái)我們來(lái)創(chuàng)建委托代理類(lèi),也就是我們的FirstClass類(lèi)。其中的代碼也是比較簡(jiǎn)單的,F(xiàn)irstClass類(lèi)實(shí)現(xiàn)了CustomDelegate的相關(guān)方法,然后為secondClass對(duì)象指定了代理對(duì)象就是當(dāng)前類(lèi)的對(duì)象。具體代碼如下所示。

package com.zeluli.callback.delegate;

public class FirstClass implements CustomDelegate {
  private SecondClass secondClass;
  
  public void beginRunSecondDelegateMethod() {
    if(this.secondClass == null) {
      this.secondClass = new SecondClass(this);
    }
  }

  //secondClass回調(diào)要執(zhí)行的方法
  @Override
  public void setValue(String value) {
    System.out.println("第二個(gè)類(lèi)回調(diào)過(guò)來(lái)的值:" + value);
  }

}

3、測(cè)試用例和運(yùn)行結(jié)果

接下來(lái)我們來(lái)看一下上述代碼的測(cè)試用例和運(yùn)行結(jié)果。下方代碼段就是我們的測(cè)試用例,代碼比較簡(jiǎn)單,就是實(shí)例化了一個(gè)FirstClass的類(lèi)對(duì)象firstObj,然后調(diào)用相應(yīng)的方法為其中的secondClass指定代理方法即可,具體如下所示。

package com.zeluli.callback.delegate;

public class Main {
  public static void main(String[] args) throws InterruptedException {
    FirstClass firstObj = new FirstClass();
    firstObj.beginRunSecondDelegateMethod();
  }
}

下方就是上述代碼的運(yùn)行結(jié)果,我們可以看出定期會(huì)執(zhí)行FirstClass中的setValue()方法。

  

二、閉包回調(diào)

上面我們實(shí)現(xiàn)了委托代理回調(diào),接下來(lái)我們來(lái)對(duì)上述示例進(jìn)行改造。將其改成匿名內(nèi)部類(lèi)的實(shí)現(xiàn)方式,也就是使用閉包的形式來(lái)實(shí)現(xiàn)回調(diào)。我們只需要講FirstClass進(jìn)行修改即可。將其委托代理回調(diào)修改成閉包回調(diào)的形式。下方代碼段就是我們修改后的FirstClass類(lèi)的源代碼。

從下方的源代碼可以看出,F(xiàn)irstClass并沒(méi)有實(shí)現(xiàn)CustomDelegate接口。在為SecondClass的對(duì)象指定委托代理對(duì)象時(shí),我們傳入的是一個(gè)匿名內(nèi)部類(lèi)的對(duì)象,而這個(gè)對(duì)象的類(lèi)型是CustomDelegate。這種用法,也是匿名內(nèi)部類(lèi)的使用方式之一。

  

修改后的代碼的測(cè)試用例以及運(yùn)行結(jié)果與之前第一部分的委托代理回調(diào)的方式一致,在此就不做過(guò)多贅述了。

三、內(nèi)部類(lèi)

既然,上述我們使用到了匿名內(nèi)部類(lèi),那么接下來(lái)的這部分我們就來(lái)看看內(nèi)部類(lèi)的相關(guān)內(nèi)容。內(nèi)部類(lèi),顧名思義,就是定義在接口、類(lèi)、方法等結(jié)構(gòu)的內(nèi)部的類(lèi)。而匿名內(nèi)部類(lèi),就是沒(méi)有名字的內(nèi)部類(lèi),這一點(diǎn)也是比較好理解的。下方我們分別從迭代器的示例以及工廠模式的示例中來(lái)窺探一下內(nèi)部類(lèi)的具體使用場(chǎng)景及使用規(guī)則。當(dāng)然這兩個(gè)示例所針對(duì)的內(nèi)部類(lèi)的角度不同。

1、迭代器中的內(nèi)部類(lèi)

在之前的文章中,我們?cè)敿?xì)的聊了迭代器模式,當(dāng)然之前的迭代器我們是使用的Swift3.0來(lái)實(shí)現(xiàn)的,今天我們就用Java的內(nèi)部類(lèi)來(lái)實(shí)現(xiàn)一個(gè)Java中的迭代器。

(1)、迭代器接口

按照之前的介紹迭代器的套路,我們還是先要?jiǎng)?chuàng)建迭代器接口的。下方的Selector就是我們創(chuàng)建的迭代器接口。

end()方法用來(lái)判斷序列是否到達(dá)了結(jié)尾處。

current()方法則用來(lái)獲取當(dāng)前序列中下標(biāo)的值。

next()方法則是移動(dòng)下標(biāo)到下一個(gè)位置。

為了統(tǒng)一迭代器使用規(guī)范性,所有的迭代器都要遵循該接口。具體代碼如下所示。

  

(2)、創(chuàng)建序列類(lèi)以及迭代器內(nèi)部類(lèi)

下方創(chuàng)建的就是我們的序列類(lèi)Sequence,該類(lèi)中的items數(shù)組用來(lái)存儲(chǔ)元素,而next屬性指向當(dāng)前值的下標(biāo)。在Sequence類(lèi)中,除了屬性、構(gòu)造器以及方法外,我們還在其中定義了一個(gè)內(nèi)部類(lèi)SequenceSelector。

SequenceSelector類(lèi)就是Sequence類(lèi)的迭代器,并且SequenceSelector要實(shí)現(xiàn)迭代器接口Selector。下方我們要注意的一點(diǎn),在內(nèi)部類(lèi)SequenceSelector中,可以直接訪問(wèn)外層類(lèi)Sequence類(lèi)的成員屬性和方法。因?yàn)闊o(wú)論是內(nèi)部類(lèi)還是Sequence類(lèi)的成員屬性,都在Sequence類(lèi)的域中。

當(dāng)然下方的代碼的邏輯是比較簡(jiǎn)單的,主要是對(duì)items數(shù)組的操作。具體代碼如下所示。

  

(3)、上述迭代器的使用

定義完迭代器后,接下來(lái),我們就來(lái)看一下迭代器的使用呢。首先我們創(chuàng)建一個(gè)序列對(duì)象,然后通過(guò)for循環(huán)往這個(gè)序列對(duì)象里邊添加對(duì)象。緊接著我們從這個(gè)序列對(duì)象中獲取其對(duì)應(yīng)的迭代器對(duì)象,然后操作迭代器對(duì)序列進(jìn)行遍歷。具體操作如下所示。

  

2、工廠模式中的匿名內(nèi)部類(lèi)

聊完迭代器的內(nèi)部類(lèi),接下來(lái)我們來(lái)看一下工廠模式中的匿名內(nèi)部類(lèi)。在之前的文章中,我們?cè)敿?xì)的聊了工廠模式的具體內(nèi)容。本篇文章我們就來(lái)看一下,匿名內(nèi)部類(lèi)在工廠模式中的使用。

(1)、類(lèi)圖

Service接口:首先我們來(lái)看一下Service接口,該接口是所有具體的實(shí)現(xiàn)類(lèi)要實(shí)現(xiàn)的接口。其中定義這具體的方法聲明。我們的實(shí)現(xiàn)類(lèi)都要繼承自該接口。

ServiceFactory接口:該接口是所有工廠類(lèi)要實(shí)現(xiàn)的接口,因?yàn)楸静糠治覀兊墓S類(lèi)是以匿名內(nèi)部類(lèi)的形式來(lái)體現(xiàn)的,所有該接口就是我們“匿名內(nèi)部類(lèi)”的類(lèi)型。

Implemention1、2類(lèi):這兩個(gè)類(lèi)就是我們的具體實(shí)現(xiàn)類(lèi),我們的工廠就負(fù)責(zé)實(shí)例化這兩個(gè)類(lèi)。

Factories類(lèi):該類(lèi)就負(fù)責(zé)調(diào)用工廠方法來(lái)創(chuàng)建相關(guān)實(shí)例,并執(zhí)行實(shí)例的相關(guān)方法。

(2)、Service和ServiceFactory接口的具體實(shí)現(xiàn)

這兩個(gè)接口的實(shí)現(xiàn)代碼比較簡(jiǎn)單,在此就不做過(guò)多贅述了,具體代碼如下所示:

package com.zeluli.innerclass.factory;

public interface Service {
  void method1();
  void method2();
}

======================================================

package com.zeluli.innerclass.factory;

public interface ServiceFactory {
  Service getService();
}

(3)、Implementation相關(guān)類(lèi)的實(shí)現(xiàn)

Implementation1Implementation2的實(shí)現(xiàn)差不多,我們就聊一下Implementation1類(lèi)的具體代碼。從下方代碼片段中我們可以看出Implementation1類(lèi)實(shí)現(xiàn)了Service接口,并且給出了接口中相關(guān)方法的實(shí)現(xiàn)。并且在Implementation1類(lèi)中有一個(gè)ServiceFactory類(lèi)型的靜態(tài)變量factory。而factory引用的是一個(gè)ServiceFactory類(lèi)型的匿名內(nèi)部類(lèi)的對(duì)象。該匿名內(nèi)部類(lèi)就是一個(gè)工程類(lèi),其中有一個(gè)方法負(fù)責(zé)創(chuàng)建當(dāng)前外圍類(lèi),也就是Implementation1類(lèi)的對(duì)象。具體實(shí)現(xiàn)如下所示。

  

(4)、Factory類(lèi)的實(shí)現(xiàn)

接下來(lái)我們就來(lái)看看Factory類(lèi)的實(shí)現(xiàn),F(xiàn)actory中就負(fù)責(zé)從工廠中獲取相應(yīng)的對(duì)象,然后執(zhí)行對(duì)象的相關(guān)方法,代碼比較簡(jiǎn)單,就不做過(guò)多贅述了。

  

(5)、測(cè)試用例與運(yùn)行結(jié)果

接下來(lái)我們來(lái)看一下上述實(shí)例的測(cè)試用例以及輸出結(jié)果,如下所示:

  

以上這篇詳談Java編程之委托代理回調(diào)、內(nèi)部類(lèi)以及匿名內(nèi)部類(lèi)回調(diào)(閉包回調(diào))就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • Java實(shí)現(xiàn)簡(jiǎn)易畫(huà)圖板

    Java實(shí)現(xiàn)簡(jiǎn)易畫(huà)圖板

    這篇文章主要為大家詳細(xì)介紹了Java實(shí)現(xiàn)簡(jiǎn)易畫(huà)圖板,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-01-01
  • SpringBoot結(jié)合mybatis-plus實(shí)現(xiàn)分頁(yè)的項(xiàng)目實(shí)踐

    SpringBoot結(jié)合mybatis-plus實(shí)現(xiàn)分頁(yè)的項(xiàng)目實(shí)踐

    本文主要介紹了SpringBoot結(jié)合mybatis-plus實(shí)現(xiàn)分頁(yè)的項(xiàng)目實(shí)踐,主要基于MyBatis-Plus 自帶的分頁(yè)插件 PaginationInterceptor,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-06-06
  • Java數(shù)據(jù)結(jié)構(gòu)學(xué)習(xí)之二叉樹(shù)

    Java數(shù)據(jù)結(jié)構(gòu)學(xué)習(xí)之二叉樹(shù)

    今天給大家?guī)?lái)的是關(guān)于Java數(shù)據(jù)結(jié)構(gòu)的相關(guān)知識(shí),文章圍繞著Java二叉樹(shù)展開(kāi),文中有非常詳細(xì)的介紹及代碼示例,需要的朋友可以參考下
    2021-06-06
  • Spring根據(jù)URL參數(shù)進(jìn)行路由的方法詳解

    Spring根據(jù)URL參數(shù)進(jìn)行路由的方法詳解

    這篇文章主要給大家介紹了關(guān)于Spring根據(jù)URL參數(shù)進(jìn)行路由的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起來(lái)看看吧。
    2017-12-12
  • 最新評(píng)論

    临邑县| 县级市| 来安县| 阿巴嘎旗| 宝应县| 新和县| 闸北区| 佛冈县| 三江| 宜都市| 车致| 获嘉县| 尼玛县| 家居| 卓资县| 长子县| 绥棱县| 南丰县| 博湖县| 财经| 依兰县| 辽宁省| 红桥区| 潞西市| 安国市| 海兴县| 汾西县| 屏边| 北流市| 西峡县| 九江县| 丹东市| 会理县| 临朐县| 黎城县| 隆昌县| 图片| 凭祥市| 即墨市| 固阳县| 汝州市|