Java中常用的設計模式之模板模式詳解

優點

封裝不變部分,擴展可變部分。

提取公共代碼,便於維護。

行為由父類控制,子類實現。

缺點

每一個不同的實現都需要一個子類來實現,導致類的個數增加,使得系統更加龐大。

使用場景

1.有多個子類共有的方法,且邏輯相同。

2.重要的、復雜的方法,可以考慮作為模板方法。

一、實現方式

假設一個場景,我們在玩遊戲的時候,都需要初始化加載遊戲,然後開始遊戲,最後結束遊戲,這像是一套模板一樣的操作,但是具體的實現方法卻不同,例如:LOL 遊戲與 CF 遊戲的加載資源肯定不同,遊戲的內容也不同。

1、遊戲抽象類

package com.asurplus.common.template;
/**
 * 遊戲抽象類
 */
public abstract class Game {
    // 初始化遊戲
    abstract void init();
    // 開始遊戲
    abstract void start();
    // 結束遊戲
    abstract void end();
    // 模板
    public final void play() {
        // 初始化遊戲
        init();
        // 開始遊戲
        start();
        // 結束遊戲
        end();
    }
}

2、LOL遊戲類

package com.asurplus.common.template;
import lombok.extern.slf4j.Slf4j;
/**
 * LOL遊戲
 */
@Slf4j
public class LolGame extends Game {
    @Override
    void init() {
        log.info("初始化 LOL 遊戲");
    }
    @Override
    void start() {
        log.info("LOL 遊戲開始");
    }
    @Override
    void end() {
        log.info("LOL 遊戲結束");
    }
}

3、CF遊戲類

package com.asurplus.common.template;
import lombok.extern.slf4j.Slf4j;
/**
 * CF遊戲
 */
@Slf4j
public class CfGame extends Game {
    @Override
    void init() {
        log.info("初始化 CF 遊戲");
    }
    @Override
    void start() {
        log.info("CF 遊戲開始");
    }
    @Override
    void end() {
        log.info("CF 遊戲結束");
    }
}

二、測試

package com.asurplus.common.template;

/**
 * 模板模式
 */
public class TestMain {
    public static void main(String[] args) {
        // LOL 遊戲
        Game lolGame = new LolGame();
        lolGame.play();
        System.out.println();
        // CF 遊戲
        Game cfGame = new CfGame();
        cfGame.play();
    }
}

輸出結果

在這裡插入圖片描述

可以看出,一套模板,可以有多個實現方式,從而實現瞭我們的工廠模式。

總結

本篇文章就到這裡瞭,希望能夠給你帶來幫助,也希望您能夠多多關註WalkonNet的更多內容!   

推薦閱讀: