デザインモードのテンプレート方法

2797 ワード

一、定義
一つの方法ではアルゴリズムの骨格を定義し、いくつかのステップをサブクラスに遅延させ、テンプレート方法により、サブクラスがアルゴリズム構造を変更しない場合に、アルゴリズム中のいくつかのステップを再定義することができる.
二、核心思想
1、このモードはアルゴリズムを作成するためのテンプレートです.
2、テンプレートの方法はアルゴリズムを一連のステップとして定義し、その中のいかなるステップも抽象的であり、サブクラスによって実現される.
3、アルゴリズムの構造が不変であることを確保するとともに、サブクラスから部分的に実現する.
三、関連設計原則
ハリウッドの原則
1、電話しないでください.電話します.
2、依存腐敗を防止するために用いる
3、あなたを使いますか?トップのコンポーネントは計算しますと言いました.
4、ハリウッドの原則は、下のコンポーネントを計算にリンクさせ、上のコンポーネントを下のコンポーネントに依存させない. 
かぎ
1、フックは抽象類で宣言された方法ですが、空いているか、デフォルトの実現しかありません.フックの存在は、サブクラスがアルゴリズムの異なる点をフックすることができます.
2、フックがあります.テンプレートの方法の中のプログラムにテンプレートの方法の一部を呼び出すかどうかを決定させてもいいです.
四、使用シーン
1、お茶とコーヒーの淹れ方
お茶:(1)誰を沸かしますか?(2)お湯でコーヒーを入れます.(3)コーヒーをコップに入れます.(4)砂糖とミルクを入れます.
コーヒー:(1)お湯を沸かした人(2)お茶をお湯に浸します.(3)お茶をコップに入れます.(4)レモンを入れます.
2、シーンを観察する
二つの泡立て方は同じところがあります.また違ったところもあります.
五、コード実現
package com.fengshu.limanman;
 
/**
 * 
 * 1、       2、        3、       
 * 
 * @author    
 *
 */
public class Temple {
    public static void main(String[] args) {
        CaffeineBeverage caffeineBeverage = new Coffee();
        caffeineBeverage.pripareRecipe();
    }
}
 
/**
 *             
 *
 */
abstract class CaffeineBeverage {
 
    /**
     * final            ,           ,            (      ),                 
     */
    final void pripareRecipe() {
        boilWater();
        brew();
        pourInCup();
        //                   
        if (needCondiments()) {
            addCondiments();
        }
    }
 
    /**
     *               ,              ,       
     */
    abstract void brew();
 
    /**
     *                   
     */
    abstract void addCondiments();
 
    void boilWater() {
        System.out.println("Boiling water");
    }
 
    void pourInCup() {
        System.out.println("Pouring into cup");
    }
 
    /**
     *        true,           
     * 
     * @return
     */
    boolean needCondiments() {
        return true;
    }
}
 
class Coffee extends CaffeineBeverage {
 
    /**
     *                       ,            
     *
     */
    @Override
    void boilWater() {
        System.out.println("Boiling water  long long");
    }
 
    @Override
    void brew() {
        System.out.println("Dripping coffee through filter");
    }
 
    @Override
    void addCondiments() {
        System.out.println("Adding Sugar and Milk");
    }
 
    /**
     *     ,            。             ,             
     */
    @Override
    boolean needCondiments() {
        return false;
    }
 
}
 
class Tea extends CaffeineBeverage {
 
    @Override
    void brew() {
        System.out.println("steeping the tea");
    }
 
    @Override
    void addCondiments() {
        System.out.println("Adding lemon");
    }
}