摘要:模板方法模式定義定義了一個算法的骨架。這里判斷了鉤子函數的結果來決定是否執行寫文章這個方法。提供課程源代碼設計模式課程實現類,這里重寫了鉤子函數,將其返回值設置成。
模板方法模式
定義了一個算法的骨架。并允許子類為一個或多個步驟提供實現。
模板方法是的子類可以在不改變算法結構的情況下,重新定義算法的某些步驟
行為型
一次性實現一個算法的不變的部分,并將可變的行為留給子類來實現。
各子類中公共的行為被提取出來并集中到一個公共的父類中,從而避免代碼的重復。
提高復用性,將公共代碼放在父類中實現提高了復用性
提高拓展性,通過增加子類來拓展新的行為。
繼承關系自身的缺點,如果父類添加新的抽象方法,所有子類都要修改。
下面開始寫代碼,假設一個場景就是我們要制作一套課程,這些課程可能包含一定包含視頻ppt,不一定包含文章。
public abstract class ACourse { protected final void makeCourse(){ this.makePPT(); this.makeVideo(); if(needWriteArticle()){ this.writeArticle(); } this.packageCourse(); } final void makePPT(){ System.out.println("制作PPT"); } final void makeVideo(){ System.out.println("制作視頻"); } final void writeArticle(){ System.out.println("編寫文章"); } //鉤子方法 protected boolean needWriteArticle(){ return false; } abstract void packageCourse(); }
這里定義了一個抽象的課程方法。對于那些一定有的內容我們生命成final的,寫文章這個方法我們也聲明成final,但是我們定義了一個鉤子方法,這個鉤子方法子類可以重寫,對于需要寫文章的方法我們就返回true,不需要的我們就返回false。makeCourse方法中定義了執行流程,在最后我們調用了this.packageCourse方法,這個調用其實是在調用子類方法,因為我們這個是交由子類來執行。通過向上轉型來調用父類方法,然后this指代是當前對象也就是子類對象,不太明白的話等會兒看接下來的代碼就知道了。這里判斷了鉤子函數的結果來決定是否執行寫文章這個方法。
public class DesignPatternCourse extends ACourse { @Override void packageCourse() { System.out.println("提供課程Java源代碼"); } @Override protected boolean needWriteArticle() { return true; } }
設計模式課程實現類,這里重寫了鉤子函數,將其返回值設置成true。這個提供源代碼就算是子類自己的實現。
public class FECourse extends ACourse { private boolean needWriteArticleFlag = false; @Override void packageCourse() { System.out.println("提供課程的前端代碼"); System.out.println("提供課程的圖片等多媒體素材"); } public FECourse(boolean needWriteArticleFlag) { this.needWriteArticleFlag = needWriteArticleFlag; } @Override protected boolean needWriteArticle() { return this.needWriteArticleFlag; } }
這里是前端課程,因為前端是一個大的區域,前端可以分為vue,react等等,所以我們把這個鉤子函數也開放出來,只是給一個默認值讓應用層自己實現。
public class TemplateMethodTest { public static void main(String[] args) { System.out.println("后端設計模式課程start---"); ACourse designPatternCourse = new DesignPatternCourse(); designPatternCourse.makeCourse(); System.out.println("后端設計模式課程end---"); System.out.println("前端課程start---"); ACourse feCourse = new FECourse(false); feCourse.makeCourse(); System.out.println("前端課程end---"); } }
測試方法,這就講完了。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/73020.html
摘要:模板方法模式定義定義抽象類并且聲明一些抽象基本方法供子類實現不同邏輯,同時在抽象類中定義具體方法把抽象基本方法封裝起來,這就是模板方法模式。 近日,ofo小黃車宣布入駐法國巴黎,正式進入全球第20個國家,共享單車已然改變了我們的出行方式。就拿我自己來說,每當下班出地鐵的第一件事,以光速鎖定一輛共享單車,百米沖刺的速度搶在別人之前占領它。 而大家都是重復著同樣的動作,拿出手機開鎖、騎車、...
摘要:重構時,模板方法模式是一個經常使用的模式,把相同的代碼抽取到父類中,然后通過鉤子函數詳見后面的擴展示例約束其行為。 定義 Define the skeleton of an algorithm in an operation,deferring some steps to subclasses.TemplateMethod lets subclasses redefine certai...
摘要:也是一些架構師常用的模式。寫出方法,需要子類自己定義穿衣服需要子類自定義洗臉刷牙子類自定義方法出門準備工作需要子類自定義出門穿阿迪吊絲的衣服整理文件,找工作恩,這個模板,差不多能滿足正常人的需求。 所謂的模板就是一個重用一萬次都不會覺得有問題的代碼。 在es6中,提出了一個 ``反引號的書寫方式--又叫做模板字符串.他最大的功能就是用來書寫模板html的.通常在js中使用模板是 T...
摘要:前言本系列文章主要根據設計模式與開發實踐整理而來,其中會加入了一些自己的思考。模板方法模式由兩部分結構組成,第一部分是抽象父類,第二部分是具體的實現子類。 前言 本系列文章主要根據《JavaScript設計模式與開發實踐》整理而來,其中會加入了一些自己的思考。希望對大家有所幫助。 文章系列 js設計模式--單例模式 js設計模式--策略模式 js設計模式--代理模式 js設計模式--迭...
閱讀 1253·2021-09-01 10:30
閱讀 2130·2021-07-23 10:38
閱讀 904·2019-08-29 15:06
閱讀 3159·2019-08-29 13:53
閱讀 3283·2019-08-26 11:54
閱讀 1835·2019-08-26 11:38
閱讀 2376·2019-08-26 10:29
閱讀 3132·2019-08-23 18:15