天天看點

采用Java 8中Lambda表達式和預設方法的模闆方法模式

原文連結 作者:   mohamed sanaulla  譯者: 李璟([email protected])

模闆方法模式是“四人幫”(譯者注:erich gamma, richard helm, ralph johnson and john vlissides)所著《design patterns book》一書中所描述的23種設計模式其中的一種,該模式旨在:

“define the skeleton of an algorithm in an operation, deferring some steps to subclasses. templatemethod lets subclasses redefine certain steps of an algorithm without changing the algorithm’s structure”。

即模闆方法定義一個算法的架構,并将某些步驟推遲到子類中實作。模闆方法允許子類在不改變算法架構的情況下,重新定義算法中某些步驟。

為了以更簡單的術語描述模闆方法,考慮這個場景:假設在一個工作流系統中,為了完成任務,有4個任務必須以給定的執行順序執行。在這4個任務中,不同工作流系統的實作可以根據自身情況自定義任務的執行内容。

模闆方法可以應用在上述場景中:将工作流系統的4個核心任務封裝到抽象類當中,如果任務可以被自定義,則将可自定義的任務推遲到子類中實作。

代碼實作:

我們來看看工作流系統如何使用:

輸出如下所示:

目前為止一切順利。但是本篇部落格的主要關注點不是模闆方法模式,而是如何利用java 8的lambda表達式和預設方法實作模闆方法模式。我之前已經說過,接口隻有在隻聲明了一個抽象方法的前提下,才可以使用lambda表達式。這個規則在本篇的例子中應這樣解釋:workflowmanager2隻能有一個抽象或者說自定義的任務。

如果你仍然對java 8中的lambda表達式和預設方法感到疑惑,可以在深入研究之前,花一點時間看一看lambda表達式和預設方法這兩篇文章。

我們可以利用帶有預設方法的接口替代抽象類,是以我們的新工作流系統如下所示:

現在我們的工作流系統帶有一個可自定義的任務2,我們繼續往下走,利用lambda表達式處理初始化工作:

這就是一個lambda表達式應用在模闆方法模式中的例子。