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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

模板方法模式coding

發布時間:2024/4/13 编程问答 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 模板方法模式coding 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
行為模式的包,然后創建一個templatemethod模板方法這樣的一個包,這里面我們引入一個業務場景,例如說制作課程,這么一個業務場景,我現在在制作這個視頻課程,那對于后端的JAVA課程,還有設計模式這個課程,在制作的時候,要制作PPT,制作視頻,還要決定去寫一個手記,還要提供前端的一些素材,例如前端的很多課程呢,都是要提供前端等素材的,而我們這個設計模式,又不提供圖片素材,那不同的課程,制作的步驟主線上是一樣的,但是在細分的一些細節上,還是有所不同,我們這個設計模式,一些圖片的素材,我們是不需要提供的,而且本身我們也沒有,那么是否去寫手記,這個呢還不一定,有的課程制作的時候必須有配套的手記,那有一些并不是必須的,寫手記并不是非必選項,完全留給子類來擴展,那么我們把這個方法做成鉤子方法,那具體怎么實現呢,現在就讓我們一起來coding,很簡單,這個設計模式非常非常簡單,首先我們創建一個類,這個類是什么呢,抽象類ACourse

這個設計模式學起來也是比較輕松的,就是一個單純的抽象類,然后下邊實現了抽象方法,Test我們先不看,我們主要看上邊,右側有一個needWriteArticle,這個方法正是重寫父類的needWriteArticle,其他的沒有變化,那我們再看一下前端課程這個類,我們要再演進一版,什么業務場景呢,FECourse,這個呢是一個前端課程,它是一個泛指,例如說,React,Vue,這些都是FECourse,對于后端課程來說,這個是一個具體的設計模式課程,當然我們沒有起后端課程這么一個類,所以我們現在聚焦在FECourse,Vue需要寫手記,而React不需要寫手記,但是我們的這個類聲明的是FECourse,那如果我們這么寫,我們看一下

不要關注Test,還是看上邊,模板方法的UML,清晰明了,非常容易理解,所以呢總結來說,對于我們這個模板方法設計模式,這個ACourse,也就是這個抽象類,就是一個模板,定義了一套標準,他呢是一種行為模式,把這些makePPT,makeVideo,這種固定的寫法,這些步驟,以及這些順序呢,都固定好,對于需要鉤子方法的這些選擇性方法,開放出去,而子類對于writeArticle實現是沒有疑義的,而對于packageCourse,完全交給子類來實現,這里面要注意一下這個final,一定要加final,否則子類是可以重寫makeCourse,也就是把步驟全部打亂,都OK的,模板方法就是為了定義一個模板,不想其他類把流程步驟給打亂,那模板方法這個模式的coding呢,就到這里,相信你們,設計模式肯定能學會,而且肯定能理解好 package com.learn.design.pattern.behavioral.templatemethod;/*** 它是一個抽象類* * * @author Leon.Sun**/ public abstract class ACourse {/*** 首先這里要寫一個protected的方法* 這個權限控制* 這個方法聲明成final的* 因為在ACourse里面定義的模板* 是不想被修改的* 所以這個方法聲明成final的* 我們都用void makeCourse* 制作課程* 這里面注意* 聲明final是不希望子類可以覆蓋這個方法* 防止修改我們這個制作課程流程的執行順序* 那這個方法先放到這兒* 現在我們來拆解一下這個小步驟* 首先我們要做一個PPT* 沒什么說的* 所有的課程都要制作PPT* 無論現在網絡上是免費的課程* 還是收費的課程* * 這里面要怎么寫呢* 首先我們這個類是為了定義一個模板* 那這個模板關鍵方法是makeCourse* 首先我們調用一下makePPT* 必須要制作PPT* 然后要makeVideo* 就是必須要makeVideo* 那對于是否寫手記來配套這個課程* 是可選的* 我們交由鉤子方法來實現* 比如這里有一個needWriteArticle方法* 如果這個方法返回true的話* 我們調用writeArticle* 那這里就使用了模板方法里面的鉤子方法* 最后我們再調用一下packageCourse* 那這里面剛剛也說了* 對于makePPT makeVideo writeArticle這里面的實現* 對于所有子類是沒有疑義的* 所以我們聲明為final的* * * */protected final void makeCourse(){this.makePPT();this.makeVideo();if(needWriteArticle()){this.writeArticle();}this.packageCourse();}/*** 直接制作PPT* 你們想一下void makePPT* 這個方法是不是也要是final的呢* 如果這個方法所有的子類都不需要重寫的話* 那我們就要把它聲明成final的* 也就是說這個行為是固定不變的* 制作什么課程* 都要制作PPT* 并且這里面的實現* 是滿足所有子類的* * */final void makePPT(){System.out.println("制作PPT");}/*** 同理制作視頻* 那我們這里的制作都用make這個動詞了* 那我們再想象一下* * */final void makeVideo(){System.out.println("制作視頻");}/*** 編寫手記* 編寫手記他是固定的* 就是編寫手記* 玩不出來什么花樣* 所以對于編寫手記這個實現* 所有的子類是認可的* 但是小明要編寫手記* 小剛就不編寫手記了* 也就是說對于這個課程來說* 編寫手記是一個可選項* 但是對于這里的實現* 子類都是認可的* 所以寫手記這個方法* 我們也把他聲明成final的* 所以我們聲明一個鉤子方法* * */final void writeArticle(){System.out.println("編寫手記");}//鉤子方法/*** 返回值是布爾* 是否需要編寫手記* 默認return false* 并且他不是final的* 子類可以覆蓋他* 寫完鉤子方法之后我們要寫一個鉤子方法* * * @return*/protected boolean needWriteArticle(){return false;}/*** 包裝課程* 那對于設計模式這個包裝來說呢* 我們要把項目的源碼* 放到這個素材里面* 而對于一些前端的課程呢* 也要放源碼* 他們還要放一些圖片的素材* 也就是對于不同的課程* 包裝課程* 上線之前* 提供的素材呢* 都是不一樣的* 而把這個方法* 完全交給子類來實現* 所以對于使用模板方法這個設計模式的時候* 我們對于業務的一個模型* 一定要抽象化* 對于擴展性以及業務后續的發展* 哪些行為是固定的* 哪些行為是要交給子類的* 哪些行為是可選的* 這些都要把這個業務分析透* 然后再來設計這個模板方法* 設計模式的使用場景* 那現在我們來聲明具體的子類實現課程* 例如DesignPatternCourse* * */abstract void packageCourse(); } package com.learn.design.pattern.behavioral.templatemethod;/*** 我們讓他繼承ACourse* 實現里面的具體方法* 現在抽象方法只有一個* * * @author Leon.Sun**/ public class DesignPatternCourse extends ACourse {/*** 打包我們寫一下具體的實現* 提供課程的JAVA源代碼* 因為現在設計的業務場景* 已經覆蓋了模板方法的業務場景* 所以對于設計模式這個課程來說* 在包裝課程的時候* 我們需要提供JAVA源代碼* 我們再寫一個SECourse* 前端課程* * 可以來到這里試一下* 我們發現makePPT makeVideo makeArticle并不能重寫* 這正是final的一個作用* 那我們現在回到測試函數里邊* * */@Overridevoid packageCourse() {System.out.println("提供課程Java源代碼");}@Overrideprotected boolean needWriteArticle() {return true;}} package com.learn.design.pattern.behavioral.templatemethod;/*** 讓他繼承ACourse* 這里面也很簡單* * * @author Leon.Sun**/ public class FECourse extends ACourse {/*** 默認是false* * */private boolean needWriteArticleFlag = false;/*** 首先提供課程的前端代碼* 然后呢還要提供一個* 提供課程的圖片等多媒體素材* 視頻等等之類的* 視頻嵌入到前端頁面里* 使用的多媒體素材* 那我們現在來看一下* 他的UML圖* * */@Overridevoid packageCourse() {System.out.println("提供課程的前端代碼");System.out.println("提供課程的圖片等多媒體素材");}/*** 現在我們使用構造器的方式* 那么我們再來到Test里邊* * * @param needWriteArticleFlag*/public FECourse(boolean needWriteArticleFlag) {this.needWriteArticleFlag = needWriteArticleFlag;}/*** 代表所有的前端類都要寫手記* 這個又不符合業務擴展的一個方向了* 那怎么辦呢* 很簡單* 把我們現在的模板方法模式呢* 再演進一步* 我們把needWriteArticle* 再開放給Test應用層* 怎么開放呢* 也是非常容易的* * 然后我們再重寫這個方法* 返回值是什么呢* 就是this.needWriteArticleFlag* 然后我們通過構造器和setter的方式呢* 把needWriteArticleFlag開放給應用層* * * */@Overrideprotected boolean needWriteArticle() {return this.needWriteArticleFlag;} } package com.learn.design.pattern.behavioral.templatemethod;/*** 直接run一下* 看一下結果* 首先對于后端設計模式開始了* 制作PPT* 制作視頻* 提供課程的JAVA源代碼* end* 前端課程我們看一下* 制作PPT* 制作視頻* 提供課程的前端代碼* 提供課程的圖片多媒體素材* 前端課程end* 那現在我們就要考慮一下* writeArticle寫手記這么一個方法* 上線是有編寫課程手記* 所以就想重寫這個方法* needWriteArticle* return什么呢* return true* * * @author Leon.Sun**/ public class Test {public static void main(String[] args) {/*** 首先我們輸出一個后端設計模式課程start* * */ // System.out.println("后端設計模式課程start---");/*** 直接new一個DesignPatternCourse* 通過父類聲明一個引用來指向子類的一個實例* * 因為Test里面new的是一個子類對象* 所以只要我們在這個類里面重寫的話* 那對于模板里面要執行方法的時候* 拿到的就是子類的這個方法的返回值* 那對于現在這個設計模式的這個課程* 他會編寫手記* 因為needWriteArticle默認的是返回false* 那我們再run一下* 可以看到后端課程設計的時候* 有一個編寫手記* 但是前端并沒有* 這個呢和預期一樣* 因為前端并沒有編寫手記的方法* 而是選用了模板默認返回值false* 那這個就是鉤子方法的具體使用* 非常簡單* 我們看一下UML有什么變化呢* * */ // ACourse designPatternCourse = new DesignPatternCourse();/*** 直接調用它的makeCourse()* 制作課程* * */ // designPatternCourse.makeCourse();/*** 然后寫一個end* * */ // System.out.println("后端設計模式課程end---");System.out.println("前端課程start---");/*** 寫一個前端的課程* * 現在我們想讓我們的前端課程寫手記* 賦值一個true* 上邊我們先注釋上* run一下* 編寫手記了* 我們再把它改成false* 再run一下* 制作課程下邊并沒有編寫手記* 那這里面想說明什么呢* 我特意設計這個case* 就想說對于模板方法* 抽象的層次* 例如說* 設計模式這個課程* 那在我們這個業務場景中* 我們把它定義為后端的一個課程* 其中的一個子課程* 而FECourse是一個大范圍的課程* 例如說React* JavaScript* 或者呢* Vue這些* 都是前端課程* 如果我們沒業務類型轉化不夠合理的話* 就會發生剛剛我寫的這個case* 他兩可以理解在我們這個業務場景中* 并不是同一個level的* 也就是設計模式的上一級* 所以這種情況* 我們有可能把適當的權限開放給應用層* 所以剛剛通過這種方式* 聲明一個自己的變量* 然后通過構造器或者setter的方式呢* 把這個flag開放給應用層* 那這種使用方式* 還是要看具體的應用場景* 現在的這種寫法是為了滿足不同的FECourse* 對于手記可能有不同需求的* 實現滿足方案* 那我們再看一下UML* * * */ACourse feCourse = new FECourse(false);feCourse.makeCourse();/*** 前端課程end* * */System.out.println("前端課程end---");}}

?

總結

以上是生活随笔為你收集整理的模板方法模式coding的全部內容,希望文章能夠幫你解決所遇到的問題。

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