package templatemethod;

/**
 * Project: PatternsBook
 * Date: 27.02.14
 * Time: 1:31
 *
 * Паттерн Шаблонный метод - задает "скелет" алгоритма в методе,
 * оставляя определение реализации некоторых шагов субклассам.
 * Субклассы могут определять некоторые части алгоритма без
 * изменения его структуры.
 *
 * @author Skurishin Vladislav
 */
public abstract class CaffeineBeverage {

    /**
     * Фишка паттерна:
     * Метод описывает алгоритм. Методы, одинаковые для разных реализаций,
     * не abstract. Методы, не одинаковые, abstract. Сам метод алгоритма final,
     * так как он указывает последовательность выполнения алгоритма и не может
     * быть изменен. Так же можно указывать final методы.
     */
    final void prepareRecipe(){
        hello(); // обязательный для все субклассов.
        boilWater();  // одинаковые
        brew(); // не одинаковые
        pourInCup(); // одинаковые действия алгоритма приготовления для чая и кофе
        if (customerWantsCondiments()){ // метод перехватчик - с помощью которого можно опустить ненужные части алгоритма.
            addCondiments(); // не одинаковые
        }
    }

    private boolean customerWantsCondiments(){
        return true;
    }

    abstract void brew();

    abstract void addCondiments();

    public final void hello(){
        System.out.println("Hello!");
    }

    public void boilWater(){
        System.out.println("Boiling water");
    }

    public void pourInCup(){
        System.out.println("Pouring into cup");
    }
}

@@ -415,22 +415,40 @@
 :%0A     *
+ -
  %D0%9C%D0%B5%D1%82%D0%BE%D0%B4
+ prepareRecipe()
  %D0%BE%D0%BF%D0%B8%D1%81%D1%8B%D0%B2%D0%B0
@@ -460,16 +460,26 @@
 %D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC. 
+%0A     * - 
 %D0%9C%D0%B5%D1%82%D0%BE%D0%B4%D1%8B, 
@@ -498,17 +498,16 @@
 %D0%BB%D1%8F %D1%80%D0%B0%D0%B7%D0%BD%D1%8B
-%D1%85
  %D1%80%D0%B5%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0
@@ -510,23 +510,16 @@
 %D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B9,
-%0A     *
  %D0%BD%D0%B5 abst
@@ -524,16 +524,26 @@
 stract. 
+%0A     * - 
 %D0%9C%D0%B5%D1%82%D0%BE%D0%B4%D1%8B, 
@@ -567,16 +567,26 @@
 stract. 
+%0A     * - 
 %D0%A1%D0%B0%D0%BC %D0%BC%D0%B5%D1%82%D0%BE
@@ -597,16 +597,49 @@
 %D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC%D0%B0 
+-prepareRecipe() %D0%BE%D0%B1%D1%8A%D1%8F%D0%B2%D0%BB%D1%8F%D0%B5%D1%82%D1%81%D1%8F %D0%BA%D0%B0%D0%BA 
 final,%0A 
@@ -643,16 +643,18 @@
 ,%0A     *
+  
  %D1%82%D0%B0%D0%BA %D0%BA%D0%B0%D0%BA
@@ -713,16 +713,26 @@
 %D0%B0 %D0%B8 
+%0A     *   
 %D0%BD%D0%B5 %D0%BC%D0%BE%D0%B6%D0%B5%D1%82
 %0A   
@@ -727,23 +727,16 @@
 %D0%BD%D0%B5 %D0%BC%D0%BE%D0%B6%D0%B5%D1%82
-%0A     *
  %D0%B1%D1%8B%D1%82%D1%8C %D0%B8%D0%B7
@@ -746,16 +746,19 @@
 %D0%B5%D0%BD. 
-%D0%A2%D0%B0%D0%BA %D0%B6%D0%B5 %D0%BC
+%0A     * - %D0%9C
 %D0%BE%D0%B6%D0%BD%D0%BE

Update CaffeineBeverage.java