設計模式——模板方法模式

設計模式——模板方法模式

定義一個操做中的算法的框架,而將一些步驟延遲到子類中。使得子類不改變算法結構便可衝定義該算法的某些特定步驟。算法

模板方法模式介紹

也許看定義有些懵逼,可是模板方法模式在設計模式中算是簡單的了,僅僅使用了Java的繼承機制。可是它的應用是很是普遍的。咱們先舉個簡單的例子讓你們對於模板方法模式有個直觀的瞭解。設計模式

模板方法模式

裏面有兩個角色bash

  • 抽象模板角色:完成對於基本方法的封裝,由子類實現。並有一個方法是模板方法對於基本方法的調用,完成固定的邏輯。
  • 具體模板角色:子類對於基本方法的完善,從而實現父類調用子類方法實現不一樣角色不一樣的內容。

例如咱們定義個抽象的汽車類,裏面有汽車啓動、中止、喇叭三個操做。可是每一個汽車的這三個操做都是不一樣的。可是向客戶演示的時候都是一樣操做啓動、中止、按喇叭。因此這就是一個典型的模板方法模式。框架

abstract class AbstractCar{
    protected abstract void run();
    protected abstract void stop();
    protected abstract void alarm();

    public final void templateMethod(){
        run();
        stop();
        alarm();
    }
}

複製代碼

接下來定義兩輛實際的汽車ide

class BmwCar extends AbstractCar{

    @Override
    protected void run() {
        System.out.println("寶馬 跑");
    }

    @Override
    protected void stop() {
        System.out.println("寶馬 停");

    }

    @Override
    protected void alarm() {
        System.out.println("寶馬 喇叭叫");
    }
}


class HmCar extends AbstractCar{

    @Override
    protected void run() {
        System.out.println("悍馬 跑");
    }

    @Override
    protected void stop() {
        System.out.println("悍馬 停");
    }

    @Override
    protected void alarm() {
        System.out.println("悍馬 喇叭叫");
    }
}

複製代碼

因此在調用的時候根據不一樣的車建立不一樣的角色便可spa

AbstractCar bmw = new BmwCar();
        bmw.templateMethod();
        AbstractCar hm = new HmCar();
        hm.templateMethod();

複製代碼

抽象模板中的基本方法儘可能設計爲protected類型,符合迪米特法則,不須要暴露的屬性或者方法儘可能設置爲protected類型。設計

模板方法模式的優勢

  • 封裝不變部分,擴展可變部分:把認爲不變部分的算法封裝到父類實現,而可變部分的則能夠經過繼承來繼續擴展。
  • 提取公共部分代碼,便於維護:若是不將公共部分抽取到父類中,任由散亂分佈,最後維護將會形成很大的困擾。
  • 行爲由父類控制,子類實現:基本方法由子類實現,所以子類能夠經過擴展的方式增長相應的功能。

參考

相關文章
相關標籤/搜索