詳細講解實用的模板方法模式和實例解析

1.簡介:

in the book Design Patterns. The template method is a method in a superclass, usually an abstract superclass, and defines the skeleton of an operation in terms of a number of high-level steps. These steps are themselves implemented by additional helper methods in the same class as the template method.( 在《設計模式》一書中。模板方法是超類(一般是抽象超類)中的方法,它根據許多高級步驟定義操做的框架。這些步驟自己由與模板方法相同的類中的其餘輔助方法實現。 )java

​ ——引用自維基百科算法

​ 這裏通俗的來說就是定義一個算法骨架,骨架中有特定方法(通常用final修飾,防止子類修改)和通常方法,通常方法用於給子類實現和擴展。設計模式

image

2.優勢和缺點:

優勢:框架

① 封裝不變部分,擴展可變部分;ide

② 提取公共代碼,便於維護;設計

③ 行爲由父類控制,子類實現。code

缺點:每個不一樣的實現都須要一個子類來實現,致使類的個數增長,使得系統更加龐大。blog

3.相關實例分析

購物場景:開發

​ 生活中咱們都離不開購物,購物咱們可能在網上也可能在實體店中購買,但大致能夠分爲如下幾個步驟:瀏覽商品、加購物車、結算商品價格。這裏咱們能夠把這個整體的步驟當作是一個抽象類,而後咱們有這三個步驟,其中具體瀏覽了什麼商品,哪些加購了均可以在子類中實現,最後咱們來結算。產品

​ 小明和小花去超市購物,小明想要去買水果,小花去買日用品。因而他們開始挑選相關的產品,最後將加購的商品到收銀臺結算。

/**
 * 超市整體購物流程
 */
abstract class GoToSuperMarket {

    // 瀏覽商品
    abstract void BrowseGoods();

    // 加入購物車
    abstract void addToCart();

    // 商品結算
    abstract void settlement();

    public final void shop() {
        BrowseGoods();
        addToCart();
        settlement();
    }
}

/**
 * 小明去超市買水果
 */
class XiaoMing extends GoToSuperMarket {


    @Override
    void BrowseGoods() {
        System.out.println("小明去超市找蘋果、橘子、香蕉。。。");
    }

    @Override
    void addToCart() {
        System.out.println("小明挑選了5斤蘋果,加入購物車");
    }

    @Override
    void settlement() {
        System.out.println("小明選完了,開始去收銀臺結算");
    }
}

/**
 * 小花去超市買日用品
 */
class XiaoHua extends GoToSuperMarket {

    @Override
    void BrowseGoods() {
        System.out.println("小花去超市找毛巾、毯子、牙刷。。。");
    }

    @Override
    void addToCart() {
        System.out.println("小花挑選了毛巾和牙刷,加入購物車");
    }

    @Override
    void settlement() {
        System.out.println("小花選完了,開始去收銀臺結算");
    }
}

public class process {

    public static void main(String[] args) {
        GoToSuperMarket shopperOne = new XiaoMing();
        shopperOne.shop();
        System.out.println();
        GoToSuperMarket shopperTwo = new XiaoHua();
        shopperTwo.shop();
    }
}
輸出結果:
小明去超市找蘋果、橘子、香蕉。。。
小明挑選了5斤蘋果,加入購物車
小明選完了,開始去收銀臺結算

小花去超市找毛巾、毯子、牙刷。。。
小花挑選了毛巾和牙刷,加入購物車
小花選完了,開始去收銀臺結算

4.總結

在平常開發中,咱們不妨把公共重複利用的代碼抽取出來,這樣既能顯得簡潔而又具備邏輯性。同時咱們又能夠擴展其它方法,使得類具備更多的功能。

相關文章
相關標籤/搜索