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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

学妹惊呼:使用Java8改造后的模板方法模式真的是yyds

發布時間:2025/3/16 java 21 豆豆
生活随笔 收集整理的這篇文章主要介紹了 学妹惊呼:使用Java8改造后的模板方法模式真的是yyds 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

△Hollis, 一個對Coding有著獨特追求的人△

這是Hollis的第?371?篇原創分享

作者 l Hollis

來源 l Hollis(ID:hollischuang)

我們在日常開發中,經常會遇到類似的場景:當要做一件事兒的時候,這件事兒的步驟是固定好的,但是每一個步驟的具體實現方式是不一定的。

通常,遇到這種情況,我們會把所有要做的事兒抽象到一個抽象類中,并在該類中定義一個模板方法。這就是所謂的模板方法模式。

以前的模板方法

在我之前的一篇《設計模式——模板方法設計模式》https://www.hollischuang.com/archives/420 文章中舉過一個例子:

當我們去銀行的營業廳辦理業務需要以下步驟:1.取號、2.辦業務、3.評價。

三個步驟中取號和評價都是固定的流程,每個人要做的事兒都是一樣的。但是辦業務這個步驟根據每個人要辦的事情不同所以需要有不同的實現。

我們可以將整個辦業務這件事兒封裝成一個抽象類:

/***?模板方法設計模式的抽象類*?@author?hollis*/public?abstract?class?AbstractBusinessHandler?{/***?模板方法*/public?final?void?execute(){getNumber();handle();judge();}/***?取號*?@return*/private?void?getNumber(){System.out.println("number-00"?+?RandomUtils.nextInt());}/***?辦理業務*/public?abstract?void?handle();?//抽象的辦理業務方法,由子類實現/***?評價*/private?void?judge(){System.out.println("give?a?praised");}}

我們在類中定義了一個execute類,這個類編排了getNumber、handle和judge三個方法。這就是一個模板方法

其中getNumber和judge都有通用的實現,只有handle方法是個抽象的,需要子類根據實際要辦的業務的內容去重寫。

有了這個抽象類和模板方法,當我們想要實現一個"存錢業務"的時候,只需要繼承該AbstractBusinessHandeler并且重寫handle方法即可:

public?class?SaveMoneyHandler?extends?AbstractBusinessHandeler?{@Overridepublic?void?handle()?{System.out.println("save?1000");}}

這樣,我們在執行存錢的業務邏輯的時候,只需要調用 SaveMoneyHandler的execute方法即可:

public?static?void?main(String?[]args){SaveMoneyHandler?saveMoneyHandler?=?new?SaveMoneyHandler();saveMoneyHandler.execute();}

輸出結果:

number-00958442164save?1000give?a?praised

以上,就是一個簡單的模板方法的實現。通過使用模板方法,可以幫助我們很大程度的復用代碼。

因為我們要在銀行辦理很多業務,所以可能需要定義很多的實現類:

//取錢業務的實現類public?class?DrawMoneyHandler?extends?AbstractBusinessHandeler?{@Overridepublic?void?handle()?{System.out.println("draw?1000");}}//理財業務的實現類public?class?MoneyManageHandler?extends?AbstractBusinessHandeler{@Overridepublic?void?handle()?{System.out.println("money?manage");}}

一直以來,開發者們在使用模板方法的時候基本都是像上面這個例子一樣:需要準備一個抽象類,將部分邏輯以具體方法以及具體構造函數的形式實現,然后聲明一些抽象方法來讓子類實現剩余的邏輯。不同的子類可以以不同的方式實現這些抽象方法,從而對剩余的邏輯有不同的實現。

但是,有了Java 8以后,模板方法有了另外一種實現方式,不需要定義特別多的實現類了。

Java 8 的函數式編程

2014年,Oracle發布了 Java 8,在Java 8中最大的新特性就是提供了對函數式編程的支持。

Java 8在java.util.function下面增加增加一系列的函數接口。其中主要有Consumer、Supplier、Predicate、Function等。

本文主要想要介紹一下Supplier和Consumer這兩個,使用者兩個接口,可以幫我們很好的改造模板方法。這里只是簡單介紹下他們的用法,并不會深入展開,如果大家想要學習更多用法,可以自行google一下。

Supplier

Supplier是一個供給型的接口,簡單點說,這就是一個返回某些值的方法。

最簡單的一個Supplier就是下面這段代碼:

public?List<String>?getList()?{return?new?ArrayList();}

使用Supplier表示就是:

Supplier<List<String>>?listSupplier?=?ArrayList::new;

Consumer

Consumer 接口消費型接口,簡單點說,這就是一個使用某些值(如方法參數)并對其進行操作的方法。

最簡單的一個Consumer就是下面這段代碼:

public?void?sum(String?a1)?{System.out.println(a1);}

使用Consumer表示就是:

Consumer<String>?printConsumer?=?a1?->?System.out.println(a1);

Consumer的用法,最見的的例子就是是Stream.forEach(Consumer)這樣的用法,

它接受一個Consumer,該Consumer消費正在迭代的流中的元素,并對每個元素執行一些操作,比如打印:

Consumer<String>?stringConsumer?=?(s)?->?System.out.println(s.length());Arrays.asList("ab",?"abc",?"a",?"abcd").stream().forEach(stringConsumer);

Java 8以后的模板方法

在介紹過了Java 8中的Consumer、Supplier之后,我們來看下怎么改造之前我們介紹過的模板方法。

首先,我們定義一個BankBusinessHandler類,并且重新定義一個execute方法,這個方法有一個入參,是Consumer類型的,然后移除handle方法,重新編排后的模板方法內容如下:

/***?@author?Hollis*/public?class?BankBusinessHandler?{private?void?execute(Consumer<BigDecimal>?consumer)?{getNumber();consumer.accept(null);judge();}private?void?getNumber()?{System.out.println("number-00"?+?RandomUtils.nextInt());}private?void?judge()?{System.out.println("give?a?praised");}}

我們實現的模板方法execute中,編排了getNumber、judge以及consumer.accept,這里面consumer.accept就是具體的業務邏輯,可能是存錢、取錢、理財等。需要由其他方法調用execute的時候傳入。

這時候,我們想要實現"存錢"業務的時候,需要BankBusinessHandler類中增加以下方法:

/***?@author?Hollis*/public?class?BankBusinessHandler?{public?void?save(BigDecimal?amount)?{execute(a?->?System.out.println("save?"?+?amount));}}

在save方法中,調用execute方法,并且在入參處傳入一個實現了"存錢"的業務邏輯的Comsumer。

這樣,我們在執行存錢的業務邏輯的時候,只需要調用 BankBusinessHandler的save方法即可:

public?static?void?main(String[]?args)?throws?{BankBusinessHandler?businessHandler?=?new?BankBusinessHandler();businessHandler.save(new?BigDecimal("1000"));}

輸出結果:

number-001736151440save1000give?a?praised

如上,當我們想要實現取錢、理財等業務邏輯的時候,和存錢類似:

/***?@author?Hollis*/public?class?BankBusinessHandler?{public?void?save(BigDecimal?amount)?{execute(a?->?System.out.println("save?"?+?amount));}public?void?draw(BigDecimal?amount)?{execute(a?->?System.out.println("draw?"?+?amount));}public?void?moneyManage(BigDecimal?amount)?{execute(a?->?System.out.println("draw?"?+?amount));}}

可以看到,通過使用Java 8中的Comsumer,我們把模板方法改造了,改造之后不再需要抽象類、抽象方法,也不再需要為每一個業務都創建一個實現類了。我們可以把所有的業務邏輯內聚在同一個業務類中。這樣非常方便這段代碼的后期運維。

前面介紹如何使用Consumer進行改造模板方法,那么Supplier有什么用呢?

我們的例子中,在取號、辦業務、評價這三個步驟中,辦業務是需要根據業務情況進行定制的,所以,我們在模板方法中,把辦業務這個作為擴展點開放給外部。

有這樣一種情況,那就是現在我們辦業務的時候,取號的方式也不一樣,可能是到銀行網點取號、在網上取號或者銀行客戶經理預約的無需取號等。

無論取號的方式如何,最終結果都是取一個號;而取到的號的種類不同,可能接收到的具體服務也不同,比如vip號會到VIP柜臺辦理業務等。

想要實現這樣的業務邏輯,就需要使用到Supplier,Supplier是一個"供給者",他可以用來定制"取號邏輯"。

首先,我們需要改造下模板方法:

/***?模板方法*/protected?void?execute(Supplier<String>?supplier,?Consumer<BigDecimal>?consumer)?{String?number?=?supplier.get();System.out.println(number);if?(number.startsWith("vip"))?{//Vip號分配到VIP柜臺System.out.println("Assign?To?Vip?Counter");}else?if?(number.startsWith("reservation"))?{//預約號分配到專屬客戶經理System.out.println("Assign?To?Exclusive?Customer?Manager");}else{//默認分配到普通柜臺System.out.println("Assign?To?Usual?Manager");}consumer.accept(null);judge();}

經過改造,execute的入參增加了一個supplier,這個supplier可以提供一個號碼。至于如何取號的,交給調用execute的方法來執行。

之后,我們可以定義多個存錢方法,分別是Vip存錢、預約存錢和普通存錢:

public?class?BankBusinessHandler?extends?AbstractBusinessHandler?{public?void?saveVip(BigDecimal?amount)?{execute(()?->?"vipNumber-00"?+?RandomUtils.nextInt(),?a?->?System.out.println("save?"?+?amount));}public?void?save(BigDecimal?amount)?{execute(()?->?"number-00"?+?RandomUtils.nextInt(),?a?->?System.out.println("save?"?+?amount));}public?void?saveReservation(BigDecimal?amount)?{execute(()?->?"reservationNumber-00"?+?RandomUtils.nextInt(),?a?->?System.out.println("save?"?+?amount));}}

在多個不同的存錢方法中,實現不同的取號邏輯,把取號邏輯封裝在supplier中,然后傳入execute方法即可。

測試代碼如下:

BankBusinessHandler?businessHandler?=?new?BankBusinessHandler();businessHandler.saveVip(new?BigDecimal("1000"));

輸出結果:

vipNumber-001638110566Assign?To?Vip?Countersave?1000give?a?praised

以上,我們就是用Comsumer和Supplier改造了模板方法模式。

使用Java 8對模板方法進行改造之后,可以進一步的減少代碼量,至少可少創建很多實現類,大大的減少重復代碼,提升可維護性。

當然,這種做法也不是十全十美的,有一個小小的缺點,那就是理解成本稍微高一點,對于那些對函數式編程不太熟悉的開發者來說, 上手成本稍微高了一些。。。

總結

以上,我們介紹了什么是模板方法模式,以及如何使用Comsumer和Supplier改造模板方法模式。

這樣的做法是我們日常開發中經常會用到的,其實,我覺得本文中的例子并不是完完全全能表達出來我想表達的意思,但是我們的真實業務中的邏輯講起來又比較復雜。

所以,這就需要大家能夠多多理解并且實踐一下。如果你代碼中用到過模板方法模式,那一定是可以通過本文中的方法進行改造的。

如果你還沒用過模板方法模式,那說明你的應用中一定有很多重復代碼,那就趕緊用起來。

作為一個開發工程師,我們要盡最大努力的消滅應用中的重復代碼,功在當代,利在千秋!

?

技術交流群

最近有很多人問,有沒有讀者交流群,想知道怎么加入。

最近我創建了一些群,大家可以加入。交流群都是免費的,只需要大家加入之后不要隨便發廣告,多多交流技術就好了。

目前創建了多個交流群,全國交流群、北上廣杭深等各地區交流群、面試交流群、資源共享群等。

有興趣入群的同學,可長按掃描下方二維碼,一定要備注:全國 Or 城市 Or 面試 Or 資源,根據格式備注,可更快被通過且邀請進群。

▲長按掃描

往期推薦

干掉 Postman?測試接口直接生成API文檔,這個工具我愛了


程序員千萬不要做舔狗啊!


官方認證:軟件及信息技術從業者為新生代農民工

如果你喜歡本文,

請長按二維碼,關注?Hollis.

轉發至朋友圈,是對我最大的支持。

點個?在看?

喜歡是一種感覺

在看是一種支持

↘↘↘

總結

以上是生活随笔為你收集整理的学妹惊呼:使用Java8改造后的模板方法模式真的是yyds的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 国内自拍青青草 | 亚洲不卡视频在线 | 久久亚洲精品无码va白人极品 | 亚洲aaaaaa | 国产性70yerg老太 | 18禁裸男晨勃露j毛免费观看 | 91极品国产| 欧美一级片在线 | 强行挺进白丝老师翘臀网站 | 天天射日日操 | 久草视频国产 | 亚洲成人午夜影院 | 国产a网| 国产精品毛片va一区二区三区 | 亚洲精品a区 | 男朋友是消防员第一季 | 久久人人爽人人爽人人片av免费 | 亚洲精品一区二区三区新线路 | 国产一区二区视频免费在线观看 | 精品久久久久久一区二区里番 | www黄色av| 91免费在线视频观看 | 日日cao| 亚洲国产一区二区三区 | 苍井空亚洲精品aa片在线播放 | 久久免费看少妇高潮v片特黄 | 免费看毛片网站 | 国内精品视频在线 | 精品久久久久久久久久久久 | 一区二区片 | 伊伊总综合网 | av在线电影网站 | 国产精品乱码久久久久久久久 | www.国产一区二区三区 | 国产露脸91国语对白 | 有码一区二区 | 97精品人妻一区二区三区蜜桃 | 日韩无遮挡 | 日本免费小视频 | 日韩一区二区精品 | 欧美一级片网址 | 欧美有码在线观看 | 天天射天天搞 | 久久久国产打桩机 | 亚洲av无码一区二区二三区软件 | 在线免费av网址 | 少妇性l交大片免潘金莲 | 亚洲午夜一区二区 | 亚洲 小说区 图片区 | 黄片毛片一级 | 美女三级视频 | 天天躁日日躁狠狠躁免费麻豆 | 精品无人国产偷自产在线 | 99精品视频免费版的特色功能 | 男操女视频在线观看 | 日日日操| 婷婷丁香在线 | 欧美日韩国产成人 | 亚洲综合在线播放 | 久久久精品国产sm调教网站 | 男人的天堂久久久 | 一区二区在线观看视频 | 日韩亚洲欧美精品 | 午夜av电影在线观看 | 97精品一区二区 | 91蜜桃传媒精品久久久一区二区 | 在线岛国| 在线1区 | 国产欧美一区二区三区鸳鸯浴 | 日韩激情av在线 | 日日燥夜夜燥 | 国产盗摄精品一区二区酒店 | 中文幕无线码中文字夫妻 | 天天爽夜夜爽视频 | 日本一区二区视频 | 风间ゆみ大战黑人 | 久色88 | 黄色片www| 一区成人 | 我要看免费毛片 | 怡红院久久 | 亚洲热在线 | www久久久久久久 | 18av在线视频 | 欧美亚洲一区二区三区 | 国内性爱视频 | 二级黄色大片 | 国产精品美女久久久久久久 | 动漫av在线播放 | 色老头av | 手机看片日韩在线 | 国产a视频 | 精品国产无码在线观看 | 黑人玩弄人妻一区二区三区影院 | 看片网址国产福利av中文字幕 | 波多野结衣免费看 | 国产免费久久久 | 久久午夜剧场 | 欧美精品久 |