Java設計模式の模版方法模式

概述
模板方法模式是類的行爲模式。準備一個抽象類,將部分邏輯以具體方法以及具體構造函數的形式實現,而後聲明一些抽象方法來迫使子類實現剩餘的邏輯。不一樣的子類能夠以不一樣的方式實現這些抽象方法,從而對剩餘的邏輯有不一樣的實現。這就是模板方法模式的用意。
好比定義一個操做中的算法的骨架,將步驟延遲到子類中。模板方法使得子類可以不去改變一個算法的結構便可重定義算法的某些特定步驟。
 
模式中的角色
抽象類(AbstractClass):實現了模板方法,定義了算法的骨架。
具體類(ConcreteClass):實現抽象類中的抽象方法,已完成完整的算法。
 
具體應用:模擬人上班以前的一些列操做
package com.blankjor.templatemethod;

/**
 * @desc 抽象的人類方法
 * @author Blankjor
 * @date 2017年6月11日 下午10:09:18
 */
public abstract class AbstractPerson {
    /**
     * 定義一個上班的方法 上班以前會進行一系列的操做 final 方法不容許改變都要上班
     */
    final void work() {
        // 起牀
        rise();
        // 穿衣服
        dress();
        // 吃早飯
        breakfast();
        // 若是是女生還要化妝
        if (isWoman()) {
            makeUp();
        }
    }

    /**
     * 公共的都要作的事情
     */
    void rise() {
        System.out.println("起牀");
    }

    void dress() {
        System.out.println("穿衣服");
    }

    void breakfast() {
        System.out.println("吃早飯");
    }

    // 等着子類去實現
    abstract void makeUp();

    // 鉤子函數
    Boolean isWoman() {
        return true;
    }

}

package com.blankjor.templatemethod;

/**
 * @desc
 * @author Blankjor
 * @date 2017年6月11日 下午10:17:44
 */
public class Man extends AbstractPerson {

    @Override
    void makeUp() {
        // 不用化妝
    }

    @Override
    Boolean isWoman() {
        return false;
    }

}

package com.blankjor.templatemethod;

/**
 * @desc
 * @author Blankjor
 * @date 2017年6月11日 下午10:17:44
 */
public class Woman extends AbstractPerson {

    @Override
    void makeUp() {
        System.out.println("化妝");
    }

    @Override
    Boolean isWoman() {
        return true;
    }

}

package com.blankjor.templatemethod;

/**
 * @desc 模版方法模式的測試方法
 * @author Blankjor
 * @date 2017年6月11日 下午10:19:18
 */
public class MainTest {
    public static void main(String[] args) {
        Man man = new Man();
        Woman woman = new Woman();
        System.out.println("男人上班");
        man.work();
        System.out.println("女人上班");
        woman.work();
    }

}

運行結果:算法

 

 
優勢
模板方法模式經過把不變的行爲搬移到超類,去除了子類中的重複代碼。
子類實現算法的某些細節,有助於算法的擴展。
經過一個父類調用子類實現的操做,經過子類擴展增長新的行爲,符合「開放-封閉原則」。
 
缺點
每一個不一樣的實現都須要定義一個子類,這會致使類的個數的增長,設計更加抽象。
 
適用場景
在某些類的算法中,用了相同的方法,形成代碼的重複。
控制子類擴展,子類必須遵照算法規則。
 
參考:http://blog.csdn.net/jason0539/article/details/45037535
 
相關文章
相關標籤/搜索