训练残骸模式– Java 8中的改进实现
Venkat Subramaniam在今天的演講中提到了有關(guān)“級(jí)聯(lián)方法”模式或“火車殘骸”模式的內(nèi)容,如下所示:
很少有人會(huì)將此與構(gòu)建器模式相關(guān)聯(lián),但事實(shí)并非如此。 無論如何,讓我們看一下Java中沒有使用lambda表達(dá)式的示例:
public class TrainWreckPattern {public static void main(String[] args) {new Mailer().to("to@example.com").from("from@exmaple.com").subject("Some subject").body("Some content").send();} }class Mailer{public Mailer to(String address){ System.out.println("To: "+address); return this;}public Mailer from(String address){ System.out.println("From: "+address); return this;}public Mailer subject(String sub){ System.out.println("Subject: "+sub); return this;}public Mailer body(String body){ System.out.println("Body: "+body); return this;}public void send(){ System.out.println("Sending ..."); } }我以Venkat Subramaniam的講話為例。 在上面的代碼中,我有一個(gè)Mailer類,該類接受一系列值,即:to,from,subject和body,然后發(fā)送郵件。 很簡(jiǎn)單吧? 但是與此有關(guān)的一個(gè)問題是:一個(gè)Mailer對(duì)象完成發(fā)送郵件后,便不知道該如何處理。 可以重新使用它來發(fā)送另一封郵件嗎? 還是應(yīng)該知道電子郵件的發(fā)送狀態(tài)? 這在上面的代碼中是未知的,很多時(shí)候人們無法在文檔中找到此信息。 如果我們可以將Mailer對(duì)象的范圍限制在某個(gè)塊之內(nèi),以便一旦操作完成就無法使用它,該怎么辦?
Java 8提供了一種使用Lambda表達(dá)式實(shí)現(xiàn)此目標(biāo)的出色機(jī)制。 讓我們看看如何做到這一點(diǎn):
public class TrainWreckPatternLambda {public static void main(String[] args) {Mailer.send( mailer -> {mailer.to("to@example.com").from("from@exmaple.com").subject("Some subject").body("Some content");});}}class Mailer{private Mailer(){}public Mailer to(String address){ System.out.println("To: "+address); return this;}public Mailer from(String address){ System.out.println("From: "+address); return this;}public Mailer subject(String sub){ System.out.println("Subject: "+sub); return this;}public Mailer body(String body){ System.out.println("Body: "+body); return this;}public static void send(Consumer<Mailer> mailerOperator){ Mailer mailer = new Mailer();mailerOperator.accept(mailer);System.out.println("Sending ..."); } }在上述實(shí)現(xiàn)中,我通過將構(gòu)造函數(shù)設(shè)為私有,將Mailer類的實(shí)例化限制為send()方法。 然后send()方法現(xiàn)在接受Consumer接口的實(shí)現(xiàn),該接口是Single Abstract方法類,可以用Lambda表達(dá)式表示。 在main()方法中,我傳遞了一個(gè)lambda表達(dá)式,該表達(dá)式接受Mailer實(shí)例,然后在將其用于send()方法之前配置mailer對(duì)象。
lambda表達(dá)式的使用為Mailer對(duì)象的使用創(chuàng)建了明確的界限,這樣,對(duì)于閱讀有關(guān)如何使用Mailer對(duì)象的代碼的人來說,它的含義就更加清晰了。
讓我知道在我分享的這個(gè)示例中是否還有其他可以改進(jìn)的地方。
翻譯自: https://www.javacodegeeks.com/2013/05/train-wreck-pattern-a-much-improved-implementation-in-java-8.html
總結(jié)
以上是生活随笔為你收集整理的训练残骸模式– Java 8中的改进实现的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 有哪些大型的ddos攻击软件(有哪些大型
- 下一篇: 剧情游戏安卓手游(剧情游戏安卓)