テンプレートメソッドデザインパターン(B)

前の私たちは、私たちはさらなる研究の下に来るように続け、この時間をテンプレートメソッドパターンを学んできました。結局のところ、我々は最初の一歩、さらに綿密な研究を学んだし、私たちを待って。

私たちは、最初のクラス図でテンプレートメソッドパターンの概要を見て:

のは、抽象クラスは、それらがテンプレートのそれが含まれている方法と基本操作を含む、定義された方法です詳しく見てみましょう。

abstract class AbstractClass {
// 这就是模板方法。它被声明为final,以免子类改变这个算法的顺序
    final void templateMethod() {
    // 模板方法定义了一连串的步骤,每个步骤由一个方法代表
        primitiveOperation1();
        primitiveOperation2();
        concreteOperation();
        hook();
    }
    
    abstract void primitiveOperation1();
    
    abstract void primitiveOperation2();
    
    final void concreteOperation() {
        // 这里是实现
    }
    
    // 这是一个具体的方法,但他什么都不做。我们叫它为hook(钩子),马上就来揭晓它如何使用
    void hook();
}

テンプレートメソッドにリンクします

フックは抽象クラスで宣言されたメソッドですが、唯一の空またはデフォルトの実装。フックは、サブクラスが、アルゴリズムの異なるポイントにリンクすることができる能力を持っている可能、があります。サブクラスにリンクされていないために。

フックは、私たちが1を見て、多くの用途があります。

public abstract class CaffeineBeverageWithHook {
 
    final void prepareRecipe() {
        boilWater();
        brew();
        pourInCup();
        // 我们加上一个小小的条件语句,该条件是否成立,是由一个具体方法决定
        if (customerWantsCondiments()) {
            addCondiments();
        }
    }
 
    abstract void brew();
 
    abstract void addCondiments();
 
    void boilWater() {
        System.out.println("Boiling water");
    }
 
    void pourInCup() {
        System.out.println("Pouring into cup");
    }
 
    // 这就是一个钩子,子类可以覆盖这个方法,但不一定需要使用
    boolean customerWantsCondiments() {
        return true;
    }
}

フックを使用するために、我々は、サブクラスでそれをカバーしています。ここでは、カフェイン飲料どうかアルゴリズムのフック制御部と、例えば、飲む必要がスパイスを追加しました

public class CoffeeWithHook extends CaffeineBeverageWithHook {
 
    public void brew() {
        System.out.println("Dripping Coffee through filter");
    }
 
    public void addCondiments() {
        System.out.println("Adding Sugar and Milk");
    }
 
    public boolean customerWantsCondiments() {
        // 询问用户,是否要加调料
        String answer = getUserInput();

        if (answer.toLowerCase().startsWith("y")) {
            return true;
        } else {
            return false;
        }
    }
 
    private String getUserInput() {
        String answer = null;

        System.out.print("Would you like milk and sugar with your coffee (y/n)? ");

        BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
        try {
            answer = in.readLine();
        } catch (IOException ioe) {
            System.err.println("IO error trying to read your answer");
        }
        if (answer == null) {
            return "no";
        }
        return answer;
    }
}

上記顧客がスパイスを望んでいるかどうか尋ねる、フックのですか?必要に応じて、内容の実施、または実施しないで。次のようにテストコードがあります:

public class BeverageTestDrive {
    public static void main(String[] args) {
 
        Tea tea = new Tea();
        Coffee coffee = new Coffee();
 
        System.out.println("\nMaking tea...");
        tea.prepareRecipe();
 
        System.out.println("\nMaking coffee...");
        coffee.prepareRecipe();

 
        TeaWithHook teaHook = new TeaWithHook();
        CoffeeWithHook coffeeHook = new CoffeeWithHook();
 
        System.out.println("\nMaking tea...");
        teaHook.prepareRecipe();
 
        System.out.println("\nMaking coffee...");
        coffeeHook.prepareRecipe();
    }
}

結果は以下の通りである:スパイスとお茶は、あなたが追加与える;コーヒーはあなたが余分に与えていない、スパイスを追加する必要はありません。

Making tea...
Boiling water
Steeping the tea
Pouring into cup
Would you like lemon with your tea (y/n)? y
Adding Lemon

Making coffee...
Boiling water
Dripping Coffee through filter
Pouring into cup
Would you like milk and sugar with your coffee (y/n)? n

だから、我々はそれがフック真の目的が何であるかでしょうか?

フックは、いくつかの用途があります。我々が言ったように、前のサブクラスは、アルゴリズムのオプション部分をフックすることができ、またはフックは、このフックを無視することができ、サブクラス、サブクラスを達成するために重要ではありませんように。フックの別の用途は、ステップが差し迫っサブクラスは、テンプレートメソッド(または単に起こった)の一部に応答する機会を持ってできるようにすることです。例えば、フックjustReOrderedList(命名法)(例えば、データが画面上に再表示)サブクラスが再編成内部リスト内の特定のアクションを実行することを可能にします。あなただけ見てきたように、フックはまた、サブクラスはその抽象クラスのための意思決定を行う能力を持っていることができます。

ハリウッドの原則

ハリウッドの原則:(コール)お電話しないで、私たちは(コール)お電話いたします。

ハリウッドの原則の方法は、私たちに防止を与える「腐敗を依存しています」。低レベルのコンポーネントも依存する高レベルのコンポーネントであり、高レベルのコンポーネントも依存側部品とサイド部品であるが、高レベルのコンポーネントは、低レベルのコンポーネントに依存している場合、また、依存低レベル成分で破損が発生頼ります。この場合は、誰もが簡単にどのようにシステム設計を知ってもらうことはできません。

ハリウッドの原則では、低レベルのコンポーネントは、システムに自身をフックすることができますが、高レベルのアセンブリは、これらの低レベルのコンポーネントを使用する際に、どのように決定します。アプローチの低レベルのコンポーネントを治療するために、つまり、ハイレベルのコンポーネントでは、「私たちはあなたを呼んでよ、私たちを呼び出さないでください。」であります

ハリウッドと原則テンプレート方式との間の接続は、実際にはかなり明白です:私たちは、テンプレート方式を設計するとき、私たちは、サブクラスを告げる「私たちを呼んではいけない、私たちはあなたを呼ぶことにします。」どのように我々はそれを行うことができますか?のは、カフェインのデザインを見てみましょう。

また、依存関係反転原理と呼ばれる原理は、ハリウッドの原則は、前にこの権利の少し味であることを知っています。それらの間の関係はどのように行うことですか?

依存関係逆転の原則は、特定のクラスの使用、およびマルチユーティリティの抽象化を避けるために私たちを教えています。低レベルのコンポーネントは、計算にフックすることができますが、高レベルのコンポーネントは、低レベルのコンポーネントに依存しないでくださいように、ハリウッドの原理は、フレームやコンポーネントの作成に使用される技術です。両方の目標は、デカップリングが、反転原理ので、デザインに頼って回避する方法にもっと注意を払うされています。

ハリウッドの原則は、我々は彼らに依存しすぎて、他のクラスを防止しながら、低レベルの構造は、相互に動作することができ柔軟な設計を作成するには、スキルを教えます。

だから我々は、テンプレートメソッドパターンフック、さらに使用することを知っても、オーバー導入すると開く隠された原則を入れて、実際の戦闘で、私たちはより良い選択肢を持つことができましょう。このデザインモードでは、あなたはそれを取得しますか?

この小さなシリーズで終了したいと考えていましたが、この本を見て、実際の予期しないテンプレートメソッドの背後に近づいていることがわかったが、我々は通常、我々は次の話に来て使用します。

愛の生活、学習と知覚の愛は、愛を蹴りました

おすすめ

転載: www.cnblogs.com/dimple91/p/10959204.html