设计模式的Java 8 Lambda表达式–命令设计模式
在本博客中,我將說明如何使用Java 8 Lambda表達式以函數式編程方式實現命令模式 。 命令模式的目的是將請求封裝為對象,從而為具有不同請求,隊列或日志請求的客戶端參數化,并支持相應的操作。 命令模式是一種編寫通用代碼的方法,該代碼根據運行時決策對序列進行排序并執行方法。 此模式的參與者如下:
- 命令 –聲明用于執行操作的接口。
- ConcreteCommand –定義Receiver對象和操作之間的綁定。
- 客戶端 –創建ConcreteCommand實例并設置其接收者。
- 調用程序 –控制命令以執行請求。
- 接收器 –執行實際工作。
這些參與者之間的關系如下圖所示:
讓我們看一下命令模式的具體示例,看看如何用lambda表達式轉換它。 假設我們有一個文件系統實用工具,該工具具有要調用的操作,例如打開文件,寫入文件和關閉文件。 可以將其實現為宏功能-即可以記錄的一系列操作,然后作為單個操作在以后運行。 這將是我們的接收者。
public interface FileSystemReceiver {void openFile();void writeFile();void closeFile(); }每個操作(例如openFile和writefile )都是命令。 我們可以創建一個通用的命令界面以適合這些不同的操作。 我們將此接口稱為“動作”,因為它表示在我們的域中執行單個動作。 這是我們所有命令對象都實現的接口。
public interface Action {public void perform(); }現在讓我們為每個操作實現Action接口。 所有這些類需要做的就是在FileReceiver上調用一個方法并將此調用包裝到我們的Action接口中。 讓我們以它們包裝的操作命名它們,并使用適當的類命名約定-因此,openFile方法對應于一個名為OpenFile的類。
public class OpenFile implements Action {private final FileReceiver fileReceiver;public OpenFile(FileReceiver fileReceiver) {this.fileReceiver = fileReceiver;}public void perform() {fileReceiver.openFile();}}現在,讓我們實現Macro類。 宏由一系列可以依次調用的動作組成,它將充當調用者。 此類可以記錄動作并集體運行它們。 我們可以將動作序列存儲在List中,然后迭代獲取每個動作以執行。
public class Macro {private final List actions;public Macro() {actions = new ArrayList<>();}public void record(Action action) {actions.add(action);}public void run() {actions.forEach(Action::perform);} }在填充宏時,我們可以將已記錄的每個命令的實例添加到Macro對象。 現在簡單地運行宏將依次調用每個命令。 這是我們的客戶代碼。
Macro macro = new Macro(); macro.record(new OpenFile(fileReceiver)); macro.record(new WriteFile(fileReceiver)); macro.record(new CloseFile(fileReceiver)); macro.run();如果到目前為止您一直與我在一起,您會想知道lambda表達式在所有這些方面都適合。 實際上,我們所有的命令類,例如OpenFile,WriteFile和CloseFile,實際上只是希望突破包裝的lambda表達式。 它們只是作為類傳遞的某些行為。 使用lambda表達式,整個模式變得更加簡單,因為我們可以完全取消這些類。 讓我們看看Macro類(客戶端)如何使用lambda表達式代替命令類。
Macro macro = new Macro(); macro.record(() -> fileReceiver.openFile()); macro.record(() -> fileReceiver.writeFile()); macro.record(() -> fileReceiver.closeFile()); macro.run();可以通過意識到這些lambda表達式中的每一個都在執行單個方法調用這一事實來進一步改善。 因此,方法引用可以直接使用。
Macro macro = new Macro(); macro.record(fileReceiver::openFile); macro.record(fileReceiver::writeFile); macro.record(fileReceiver::closeFile); macro.run();命令模式很容易擴展,可以在接收器中添加新的操作方法以創建新的命令實現,而無需更改客戶端代碼。 JDK中的Runnable接口(java.lang.Runnable)是使用Command模式的流行接口。 在這個博客中,我試圖用Java 8 lambda表達式來表達命令模式。 通過使用lambda表達式,您會看到,所需的樣板文件少得多,從而導致代碼更簡潔。
這篇文章的靈感來自Richard Warburton的文章使用帶lambda表達式的命令模式 。
翻譯自: https://www.javacodegeeks.com/2015/09/java-8-lambda-expression-for-design-patterns-command-design-pattern.html
總結
以上是生活随笔為你收集整理的设计模式的Java 8 Lambda表达式–命令设计模式的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 苹果怎么清理缓存和垃圾清理
- 下一篇: java ee开发环境_设置Java E