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

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

模板方法模式–使用Lambda表达式,默认方法

發(fā)布時(shí)間:2023/12/3 编程问答 21 豆豆
生活随笔 收集整理的這篇文章主要介紹了 模板方法模式–使用Lambda表达式,默认方法 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

模板方法模式是Erich Gamma,Richard Helm,Ralph Johnson和John Vlissides在著名的《 設(shè)計(jì)模式》一書(shū)中解釋的23種設(shè)計(jì)模式之一。 這種模式的意圖表示為:

在操作中定義算法的框架,將某些步驟推遲到子類。 TemplateMethod允許子類重新定義算法的某些步驟,而無(wú)需更改算法的結(jié)構(gòu)。

為了簡(jiǎn)單地解釋,請(qǐng)考慮以下情形:假設(shè)有一個(gè)工作流系統(tǒng),其中必須以給定的順序執(zhí)行4個(gè)任務(wù)才能成功完成工作流。 4個(gè)任務(wù)中的一些任務(wù)可以通過(guò)以下方式自定義
不同的工作流程系統(tǒng)實(shí)施。

通過(guò)將工作流系統(tǒng)封裝到一個(gè)抽象類中,而實(shí)現(xiàn)的4個(gè)任務(wù)中只有很少的任務(wù),可以將模板方法模式應(yīng)用于上述場(chǎng)景。 將其余任務(wù)的實(shí)現(xiàn)留給抽象類的子類。

所以上面的實(shí)現(xiàn)時(shí):

/*** Abstract Workflow system*/ abstract class WorkflowManager2{public void doTask1(){System.out.println("Doing Task1...");}public abstract void doTask2();public abstract void doTask3();public void doTask4(){System.out.println("Doing Task4...");} }/*** One of the extensions of the abstract workflow system*/ class WorkflowManager2Impl1 extends WorkflowManager2{@Overridepublic void doTask2(){System.out.println("Doing Task2.1...");}@Override public void doTask3(){System.out.println("Doing Task3.1...");} }/*** Other extension of the abstract workflow system*/ class WorkflowManager2Impl2 extends WorkflowManager2{@Overridepublic void doTask2(){System.out.println("Doing Task2.2...");}@Override public void doTask3(){System.out.println("Doing Task3.2...");} }

讓我繼續(xù)說(shuō)明如何使用這些工作流程實(shí)現(xiàn):

public class TemplateMethodPattern {public static void main(String[] args) {initiateWorkFlow(new WorkflowManager2Impl1());initiateWorkFlow(new WorkflowManager2Impl2());}static void initiateWorkFlow(WorkflowManager2 workflowMgr){System.out.println("Starting the workflow ... the old way");workflowMgr.doTask1();workflowMgr.doTask2();workflowMgr.doTask3();workflowMgr.doTask4();} }

和輸出將是..

Starting the workflow ... the old way Doing Task1... Doing Task2.1... Doing Task3.1... Doing Task4... Starting the workflow ... the old way Doing Task1... Doing Task2.2... Doing Task3.2... Doing Task4...

到目前為止,一切都很好。 但是,本文的主要目的不是創(chuàng)建有關(guān)Template Method模式的另一篇博客文章,而是了解如何利用Java 8 Lambda Expression和Default Methods 。 我之前已經(jīng)寫(xiě)過(guò),只有具有單一抽象方法的接口才能被編寫(xiě)為lambda表達(dá)式。 在此示例中,這意味著在四個(gè)任務(wù)中,WorkflowManager2只能包含一個(gè)抽象/可自定義任務(wù)。

因此,限制為一種抽象方法是一個(gè)主要限制,可能不適用于許多實(shí)時(shí)方案。 我不希望重復(fù)相同的舊Template Method模式示例,而我寫(xiě)這篇文章的主要目的是說(shuō)明在用單個(gè)抽象方法處理抽象類的情況下如何利用lambda表達(dá)式和默認(rèn)方法。

如果您想知道Java中的這些lambda表達(dá)式以及Java中的這些默認(rèn)方法是什么意思,那么在繼續(xù)之前,請(qǐng)花一些時(shí)間來(lái)閱讀有關(guān)lambda表達(dá)式和默認(rèn)方法的信息 。

我們將使用具有默認(rèn)方法的接口來(lái)代替抽象類,因此我們的工作流系統(tǒng)將如下所示:

interface WorkflowManager{public default void doTask1(){System.out.println("Doing Task1...");}public void doTask2();public default void doTask3(){System.out.println("Doing Task3...");}public default void doTask4(){System.out.println("Doing Task4...");} }

現(xiàn)在,我們有了帶有可自定義Task2的工作流系統(tǒng),我們將繼續(xù)使用Lambda表達(dá)式啟動(dòng)一些自定義工作流…

public class TemplateMethodPatternLambda {public static void main(String[] args) {/*** Using lambda expression to create different * implementation of the abstract workflow*/initiateWorkFlow(()->System.out.println("Doing Task2.1..."));initiateWorkFlow(()->System.out.println("Doing Task2.2..."));initiateWorkFlow(()->System.out.println("Doing Task2.3..."));}static void initiateWorkFlow(WorkflowManager workflowMgr){System.out.println("Starting the workflow ...");workflowMgr.doTask1();workflowMgr.doTask2();workflowMgr.doTask3();workflowMgr.doTask4();} }

這是可以在模板方法模式中利用lambda表達(dá)式的一種小方法

參考: 模板方法模式–使用Lambda表達(dá)式,來(lái)自JCG合作伙伴 Mohamed Sanaulla的默認(rèn)方法,來(lái)自Experiences Unlimited博客。

翻譯自: https://www.javacodegeeks.com/2013/05/template-method-pattern-using-lambda-expressions-default-methods.html

總結(jié)

以上是生活随笔為你收集整理的模板方法模式–使用Lambda表达式,默认方法的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。