JAVA设计模式之模板模式
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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 }
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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 }
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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 }
本文来自博客园,作者:wzyy,转载请注明原文链接:https://www.cnblogs.com/wwzyy/p/5045905.html