最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java中的模板模式說明與實現(xiàn)

 更新時間:2023年10月09日 08:48:19   作者:靖節(jié)先生  
這篇文章主要介紹了Java中的模板模式說明與實現(xiàn),模板方法模式,又叫模板模式,在一個抽象類公開定義了執(zhí)行它的方法的模板,它的子類可以更需要重寫方法實現(xiàn),但可以成為典型類中定義的方式進行,需要的朋友可以參考下

1. 模板模式概述

1.1 模板模式介紹

  • 模板方法模式(Template Method Pattern),又叫模板模式(Template Pattern), 在一個抽象類公開定義了執(zhí)行它的方法的模板。它的子類可以更需要重寫方法實現(xiàn),但可以成為典型類中定義的方式進行。
  • 簡單說,模板方法模式定義了一個操作中的算法的核心定義,而將一些步驟遲緩到子類中,模仿子類可以不改變一一個算法的結(jié)構(gòu),就可以重新定義該算法的部分特定步驟。
  • 這些類型的設(shè)計模式屬于行為型模式。

模板模式適用于通用步驟的操作,比如做菜,不管你是西紅柿炒雞蛋,還是土豆燉牛肉實現(xiàn)步驟都是一樣的,備料,做菜,上菜。 再比如投放系統(tǒng),不管你是投放巨量引擎,廣點通還是百度,前期工作實現(xiàn)步驟也都是一樣的,配置物料信息,構(gòu)建投放對象,投放廣告。

1.2 模板模式類圖

在這里插入圖片描述

對原理類圖的說明-即(模板方法模式的角色及職責)

1.AbstractClass 抽象類, 類中實現(xiàn)了模板方法(template),定義了算法的骨架,具體子類需要去實現(xiàn) 其它的抽象方法。

2.ConcreteClass 實現(xiàn)抽象方法, 以完成算法中特點子類的步驟。

1.3 模板方法模式的注意事項和細節(jié)

  • 基本思想是:算法只存在于一個地方,也就是在父類中,容易修改.需要修改算法時,只要修改父類的模板方 法或者已經(jīng)實現(xiàn)的某些步驟,子類就會繼承這些修改
  • 實現(xiàn)了最大化代碼復用.父類的模板方法和已實現(xiàn)的某些步驟會被子類繼承而直接使用
  • 既統(tǒng)一了算法,也提供了很大的靈活性.父類的模板方法確保了算法的結(jié)構(gòu)保持不變,同時由子類提供部分步 驟的實現(xiàn).
  • 該模式的不足之處:每個不同的實現(xiàn)都需要一個子類實現(xiàn),導致類的個數(shù)增加,使得系統(tǒng)更加龐大
  • 一般模板方法都加上 final 關(guān)鍵字, 防止子類重寫模板方法
  • 模板方法模式使用場景:當要完成在某個過程,該過程要執(zhí)行一系列步驟 ,這一系列的步驟基本相同,但其 個別步驟在實現(xiàn)時 可能不同,通常考慮用模板方法模式來處理

2. 模板模式實現(xiàn)

模板模式實現(xiàn)案例采用三種方式: 第一案例是做菜,無論做什么菜都是這三個步驟,備料,做菜,上菜,但是三個步驟都不相同,模板定義步驟流程,通過不同的子類繼承抽象模板實現(xiàn)模板設(shè)計模式。

第二個案例是銀行辦理業(yè)務(wù),無論辦理什么業(yè)務(wù)都是取號,辦理業(yè)務(wù),評價。這里取號與評價都是相同的,各個子類只需要處理不同業(yè)務(wù)即可,通過不同的子類繼承抽象模板實現(xiàn)模板設(shè)計模式。

第三個案例是銀行辦理業(yè)務(wù)的Java8函數(shù)式編程消費者模式Consumer模式改造,原理相同。

2.1 做菜模板模式

DishEggsWithTomato

package com.zrj.design.template.dish;
/**
 * 西紅柿炒雞蛋
 *
 * @author zrj
 * @since 2022/2/8
 */
public class DishEggsWithTomato extends DishTemplate {
    @Override
    public void preparation() {
        System.out.println("準備西紅柿雞蛋...");
    }
    @Override
    public void doing() {
        System.out.println("開始炒西紅柿雞蛋...");
    }
    @Override
    public void carriedDishes() {
        System.out.println("西紅柿雞蛋裝盤...");
    }
}

DishOnionWithTofu

package com.zrj.design.template.dish;
/**
 * 小蔥拌豆腐
 *
 * @author zrj
 * @since 2022/2/8
 */
public class DishOnionWithTofu extends DishTemplate {
    @Override
    public void preparation() {
        System.out.println("準備小蔥豆腐...");
    }
    @Override
    public void doing() {
        System.out.println("開始炒小蔥拌豆腐...");
    }
    @Override
    public void carriedDishes() {
        System.out.println("小蔥拌豆腐裝盤...");
    }
}

DishTemplate

package com.zrj.design.template.dish;
/**
 * 做菜模板類
 * 用于定義做菜的執(zhí)行步驟,所有菜都可以按照這種方式做菜
 *
 * @author zrj
 * @since 2022/2/8
 */
public abstract class DishTemplate {
    /**
     * 做菜執(zhí)行步驟
     */
    public final void doDish() {
        this.preparation();
        this.doing();
        this.carriedDishes();
    }
    /**
     * 備料
     */
    public abstract void preparation();
    /**
     * 做菜
     */
    public abstract void doing();
    /**
     * 上菜
     */
    public abstract void carriedDishes();
}

DishTemplateTest

package com.zrj.design.template.dish;
import org.junit.Test;
/**
 * 模板模式
 * 抽象父類定義方法模板,子類自定義實現(xiàn)方式。
 * 優(yōu)點: 1、封裝不變部分,擴展可變部分。 2、提取公共代碼,便于維護。 3、行為由父類控制,子類實現(xiàn)。
 * 缺點:每一個不同的實現(xiàn)都需要一個子類來實現(xiàn),導致類的個數(shù)增加,使得系統(tǒng)更加龐大。
 * 使用場景: 1、有多個子類共有的方法,且邏輯相同。 2、重要的、復雜的方法,可以考慮作為模板方法。
 * 注意事項:為防止惡意操作,一般模板方法都加上 final 關(guān)鍵詞。
 *
 * 使用場景很多,只要有相同的執(zhí)行邏輯,或者重要的復雜的方法,都可以交給父類管理。
 * 比如開發(fā)XX系統(tǒng)步驟都是一樣的,立項,需求,開發(fā),測試,上線。
 *
 * @author zrj
 * @since 2022/2/8
 */
public class DishTemplateTest {
    @Test
    public void templateTest() {
        System.out.println("----------西紅柿炒雞蛋----------");
        DishTemplate eggsWithTomato = new DishEggsWithTomato();
        eggsWithTomato.doDish();
        System.out.println("----------小蔥拌豆腐----------");
        DishTemplate onionWithTofu = new DishOnionWithTofu();
        onionWithTofu.doDish();
    }
}

2.2 銀行辦理業(yè)務(wù)模板模式

BankBusinessHandler

package com.zrj.design.template.bank;
import cn.hutool.core.util.RandomUtil;
/**
 * 模板方法設(shè)計模式的抽象類
 * 模板設(shè)計模式主要用來處理相同處理流程中的不同點,例如銀行辦理業(yè)務(wù),無論什么業(yè)務(wù),首先需要取號,其次處理業(yè)務(wù),然后評價不同之處在于處理不同的業(yè)務(wù)使用不同的方式。
 * BankBusinessHandler作為抽象模板
 * BankSaveMoneyHandler作為存錢業(yè)務(wù)處理類,繼承抽象模板BankBusinessHandler
 * BankDrawMoneyHandler作為理財業(yè)務(wù)處理類,繼承抽象模板BankBusinessHandler
 *
 * @author zrj
 * @since 2022/2/8
 **/
public abstract class BankBusinessHandler {
    /**
     * 模板方法,執(zhí)行器
     */
    public final void execute() {
        getNumber();
        handle();
        judge();
    }
    /**
     * 取號
     */
    private void getNumber() {
        System.out.println("取號:" + RandomUtil.randomNumbers(8));
    }
    /**
     * 辦理業(yè)務(wù)
     */
    public abstract void handle();
    /**
     * 評價
     */
    private void judge() {
        System.out.println("評價:五星好評!");
    }
}

BankBusinessHandlerTest

package com.zrj.design.template.bank;
/**
 * 模板方法測試類
 *
 * @author zrj
 * @since 2022/2/8
 **/
public class BankBusinessHandlerTest {
    public static void main(String[] args) {
        //存錢業(yè)務(wù)處理
        BankSaveMoneyHandler bankSaveMoneyHandler = new BankSaveMoneyHandler();
        bankSaveMoneyHandler.execute();
        System.out.println("------------------------------");
        //理財業(yè)務(wù)處理
        BankDrawMoneyHandler bankDrawMoneyHandler = new BankDrawMoneyHandler();
        bankDrawMoneyHandler.execute();
    }
}

BankDrawMoneyHandler

package com.zrj.design.template.bank;
/**
 * 理財業(yè)務(wù)
 *
 * @author zrj
 * @since 2022/2/8
 **/
public class BankDrawMoneyHandler extends BankBusinessHandler {
    /**
     * 辦理業(yè)務(wù)
     */
    @Override
    public void handle() {
        System.out.println("理財:2000$");
    }
}

BankSaveMoneyHandler

package com.zrj.design.template.bank;
/**
 * 存錢業(yè)務(wù)
 *
 * @author zrj
 * @since 2022/2/8
 **/
public class BankSaveMoneyHandler extends BankBusinessHandler {
    /**
     * 辦理業(yè)務(wù)
     */
    @Override
    public void handle() {
        System.out.println("存錢:1000$");
    }
}

2.3 銀行辦理業(yè)務(wù)函數(shù)式編程改造

BankBusinessHandlerCustomer

package com.zrj.design.template.customer;
import cn.hutool.core.util.RandomUtil;
import java.math.BigDecimal;
import java.util.function.Consumer;
/**
 * 模板設(shè)計模式的抽象類
 * Java8函數(shù)式編程消費者模式Customer實現(xiàn)模板設(shè)計模式
 *
 * @author zrj
 * @since 2022/2/8
 **/
public class BankBusinessHandlerCustomer {
    /**
     * 存錢
     */
    public void save(BigDecimal amount) {
        execute(a -> System.out.println("存錢:" + amount));
    }
    /**
     * 理財
     */
    public void draw(BigDecimal amount) {
        execute(a -> System.out.println("理財:" + amount));
    }
    /**
     * 模板方法,執(zhí)行器
     */
    public void execute(Consumer<BigDecimal> consumer) {
        getNumber();
        consumer.accept(null);
        judge();
    }
    /**
     * 取號
     */
    private void getNumber() {
        System.out.println("取號:" + RandomUtil.randomNumbers(8));
    }
    /**
     * 評價
     */
    private void judge() {
        System.out.println("評價:五星好評!");
    }
}

BankBusinessHandlerCustomerTest

package com.zrj.design.template.customer;
import java.math.BigDecimal;
/**
 * @author zrj
 * @since 2022/2/8
 **/
public class BankBusinessHandlerCustomerTest {
    public static void main(String[] args) {
        //構(gòu)建銀行業(yè)務(wù)處理對象
        BankBusinessHandlerCustomer businessHandler = new BankBusinessHandlerCustomer();
        //存錢業(yè)務(wù)處理
        businessHandler.save(new BigDecimal("3000"));
        System.out.println("------------------------------");
        //理財業(yè)務(wù)處理
        businessHandler.draw(new BigDecimal("6000"));
    }
}

到此這篇關(guān)于Java中的模板模式說明與實現(xiàn)的文章就介紹到這了,更多相關(guān)Java模板模式實現(xiàn)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Java數(shù)據(jù)結(jié)構(gòu)學習之樹

    Java數(shù)據(jù)結(jié)構(gòu)學習之樹

    這篇文章主要介紹了Java數(shù)據(jù)結(jié)構(gòu)學習之樹,文中有非常詳細的代碼示例,對正在學習java數(shù)據(jù)結(jié)構(gòu)的小伙伴們有非常好的幫助,需要的朋友可以參考下
    2021-05-05
  • springBoot接入阿里云oss的實現(xiàn)步驟

    springBoot接入阿里云oss的實現(xiàn)步驟

    這篇文章主要介紹了springBoot接入阿里云oss的實現(xiàn)步驟,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2021-01-01
  • Java利用MD5加鹽實現(xiàn)對密碼進行加密處理

    Java利用MD5加鹽實現(xiàn)對密碼進行加密處理

    在開發(fā)的時候,有一些敏感信息是不能直接通過明白直接保存到數(shù)據(jù)庫的。最經(jīng)典的就是密碼了。如果直接把密碼以明文的形式入庫,不僅會泄露用戶的隱私,對系統(tǒng)也是極其的不厲。本文就來和大家介紹一下如何對密碼進行加密處理,感興趣的可以了解一下
    2023-02-02
  • mybatisPlus填坑之邏輯刪除的實現(xiàn)

    mybatisPlus填坑之邏輯刪除的實現(xiàn)

    本文主要介紹了mybatisPlus填坑之邏輯刪除的實現(xiàn),文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-01-01
  • Java 集合 Collection介紹及常用方式

    Java 集合 Collection介紹及常用方式

    Collection是單列集合的祖宗接口,它的功能是全部單列集合都可以繼承使用的,這篇文章主要介紹了Java 集合 Collection的常用方式,需要的朋友可以參考下
    2025-05-05
  • struts2與cookie 實現(xiàn)自動登錄和驗證碼驗證實現(xiàn)代碼

    struts2與cookie 實現(xiàn)自動登錄和驗證碼驗證實現(xiàn)代碼

    這篇文章主要介紹了struts2與cookie 實現(xiàn)自動登錄和驗證碼驗證實現(xiàn)代碼的相關(guān)資料,需要的朋友可以參考下
    2016-10-10
  • java中FileOutputStream中文亂碼問題解決辦法

    java中FileOutputStream中文亂碼問題解決辦法

    這篇文章主要介紹了java中FileOutputStream中文亂碼問題解決辦法的相關(guān)資料,需要的朋友可以參考下
    2017-04-04
  • 記一次用IDEA打開java項目后不能運行的解決方法

    記一次用IDEA打開java項目后不能運行的解決方法

    這篇文章主要介紹了記一次用IDEA打開java項目后不能運行的解決方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2021-03-03
  • Java?Chassis3熔斷機制的改進路程技術(shù)解密

    Java?Chassis3熔斷機制的改進路程技術(shù)解密

    這篇文章主要介紹了Java?Chassis?3技術(shù)解密之熔斷機制的改進路程實例分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2024-01-01
  • Gson中@JsonAdater注解的幾種方式總結(jié)

    Gson中@JsonAdater注解的幾種方式總結(jié)

    這篇文章主要介紹了Gson中@JsonAdater注解的幾種方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-08-08

最新評論

洞头县| 滨海县| 宜城市| 卢湾区| 永城市| 岐山县| 丽水市| 汶上县| 淮阳县| 楚雄市| 北海市| 华蓥市| 邵阳市| 双城市| 磐安县| 连云港市| 波密县| 岐山县| 荥阳市| 仙游县| 怀安县| 元谋县| 武陟县| 耿马| 福海县| 金阳县| 广灵县| 曲周县| 长汀县| 麻阳| 祁连县| 清新县| 高尔夫| 普安县| 萍乡市| 维西| 玉林市| 科技| 岳西县| 巴南区| 柳林县|