JAVA设计模式之模板模式

 1 public abstract  class RefreshBeverage {
 2         
 3     public final void prepareBeverageTemplate(){
 4 
 5         boilWater();
 6         brew();
 7         pourInCup();
 8         if(isAddCondiments()){
 9             addCondiments();    
10         }    
11     }
12     //钩子函数,提供一个默认或空的实现;具体的子类可以自行决定是否挂钩以及如何挂钩
13     protected boolean isAddCondiments() {
14         
15         return true;
16     }
17     private void boilWater(){
18         System.out.println("1。。。。。。。");    
19     }
20     protected abstract void brew();
21     
22     private void pourInCup(){
23         System.out.println("3.。。。。。。。");    
24     }
25     protected abstract void addCondiments(); 
26 }
抽象基类,为所有子类提供一个算法框架
 1 public class Coffee extends RefreshBeverage{
 2 
 3     @Override
 4     protected void brew() {
 5         System.out.println("2.coffee泡制方式");
 6         
 7     }
 8 
 9     @Override
10     protected void addCondiments() {
11         System.out.println("4.coffee");
12         
13     }
14 
15 }
16 
17 public  class Tea extends RefreshBeverage{
18 
19     @Override
20     protected void brew() {
21         System.out.println("2.teaaa");    
22     }
23 
24     @Override
25     protected void addCondiments() {
26         
27     }
28     //子类通过覆盖的形式选择挂载钩子函数
29     @Override
30     protected boolean isAddCondiments() {    
31         return false;
32     }
33 }
实现类
 1 public class Test {
 2     
 3     /**
 4      * 模板方法模式的实现要素
 5      * 准备一个抽象类,将部分逻辑以具体方法的形式实现,
 6      * 然后声明一些抽象方法交由子类实现剩余逻辑,
 7      * 用钩子方法给予子类更大的灵活性。
 8      * 最后将方法总构成一个不可改变的模板方法
 9      * 
10      * 适用场景
11      * 1.算法或操作遵循相似的逻辑
12      * 2.重构时(把相同的代码抽象到父类中)
13      * 3.重要、复杂的算法,核心算法设计为模板算法
14      * 
15      * 优点
16      * 1.封装性好    2.复用性好    3.屏蔽细节    4.便于维护
17      * 缺点
18      * 继承
19      * */
20     public static void main(String[] args) {
21         RefreshBeverage coffee = new Coffee();
22         coffee.prepareBeverageTemplate();
23         
24         System.out.println();
25         RefreshBeverage tea = new Tea();
26         tea.prepareBeverageTemplate();
27     }
28 }
测试类
原文地址:https://www.cnblogs.com/wwzyy/p/5045905.html