博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
模板方法模式
阅读量:4308 次
发布时间:2019-06-06

本文共 2167 字,大约阅读时间需要 7 分钟。

Template Method

模板方法定义了一个算法的步骤,并允许子类为一个或多个步骤提供实现.
它是一个骨架,在框架的设计中多用此设计模式.
对模板方法进行挂钩:
钩子是一种被声明在抽象类中的方法,但只有空的或者默认的实现.钩子的存在,
可以让子灰有能力对算法的不同点进行挂钩.要不要挂钩,由子类自行决定.
好莱坞原则:
高层组件对低层组件的方式是"别调用我们,我们会调用你".

Java代码  
  1. public abstract class CaffeineBeverage {  
  2. //不希望子类覆盖此方法,声明为final    
  3.     final void prepareRecipe() {  
  4.         boilWater();  
  5.         brew();  
  6.         pourInCup();  
  7.         addCondiments();  
  8.     }  
  9.    
  10.     abstract void brew();  
  11.     
  12.     abstract void addCondiments();  
  13.    
  14.     void boilWater() {  
  15.         System.out.println("Boiling water");  
  16.     }  
  17.     
  18.     void pourInCup() {  
  19.         System.out.println("Pouring into cup");  
  20.     }  
  21. }  

Java代码  
  1. public class Tea extends CaffeineBeverage {  
  2.     public void brew() {  
  3.         System.out.println("Steeping the tea");  
  4.     }  
  5.     public void addCondiments() {  
  6.         System.out.println("Adding Lemon");  
  7.     }  
  8. }  

Java代码  
  1. public class Coffee extends CaffeineBeverage {  
  2.     public void brew() {  
  3.         System.out.println("Dripping Coffee through filter");  
  4.     }  
  5.     public void addCondiments() {  
  6.         System.out.println("Adding Sugar and Milk");  
  7.     }  
  8. }  

对模板方法使用钩子:

Java代码  
  1. public abstract class CaffeineBeverageWithHook {  
  2.    
  3.     void prepareRecipe() {  
  4.         boilWater();  
  5.         brew();  
  6.         pourInCup();  
  7.         if (customerWantsCondiments()) {  
  8.             addCondiments();  
  9.         }  
  10.     }  
  11.    
  12.     abstract void brew();  
  13.    
  14.     abstract void addCondiments();  
  15.    
  16.     void boilWater() {  
  17.         System.out.println("Boiling water");  
  18.     }  
  19.    
  20.     void pourInCup() {  
  21.         System.out.println("Pouring into cup");  
  22.     }  
  23.    
  24.     boolean customerWantsCondiments() {  
  25.         return true;  
  26.     }  
  27. }  
  1. import java.io.*;  
  2.   
  3. public class CoffeeWithHook extends CaffeineBeverageWithHook {  
  4.    
  5.     public void brew() {  
  6.         System.out.println("Dripping Coffee through filter");  
  7.     }  
  8.    
  9.     public void addCondiments() {  
  10.         System.out.println("Adding Sugar and Milk");  
  11.     }  
  12.    
  13.     public boolean customerWantsCondiments() {  
  14.   
  15.         String answer = getUserInput();  
  16.   
  17.         if (answer.toLowerCase().startsWith("y")) {  
  18.             return true;  
  19.         } else {  
  20.             return false;  
  21.         }  
  22.     }  
  23.    
  24.     private String getUserInput() {  
  25.         String answer = null;  
  26.   
  27.         System.out.print("Would you like milk and sugar with your coffee (y/n)? ");  
  28.   
  29.         BufferedReader in = new BufferedReader(new InputStreamReader(System.in));  
  30.         try {  
  31.             answer = in.readLine();  
  32.         } catch (IOException ioe) {  
  33.             System.err.println("IO error trying to read your answer");  
  34.         }  
  35.         if (answer == null) {  
  36.             return "no";  
  37.         }  
  38.         return answer;  
  39.     }  
  40. }  s

转载于:https://www.cnblogs.com/zhangjiangmichael/archive/2011/11/28/2266253.html

你可能感兴趣的文章
Vue 路由懒加载根据根路由合并chunk块
查看>>
vue中 不更新视图 四种解决方法
查看>>
MySQL 查看执行计划
查看>>
OpenGL ES 3.0(四)图元、VBO、VAO
查看>>
OpenGL ES 3.0(五)纹理
查看>>
OpenGL ES 3.0(八)实现带水印的相机预览功能
查看>>
OpenGL ES 3.0(九)实现美颜相机功能
查看>>
FFmpeg 的介绍与使用
查看>>
Android 虚拟机简单介绍——ART、Dalvik、启动流程分析
查看>>
原理性地理解 Java 泛型中的 extends、super 及 Kotlin 的协变、逆变
查看>>
FFmpeg 是如何实现多态的?
查看>>
FFmpeg 源码分析 - avcodec_send_packet 和 avcodec_receive_frame
查看>>
FFmpeg 新旧版本编码 API 的区别
查看>>
RecyclerView 源码深入解析——绘制流程、缓存机制、动画等
查看>>
Android 面试题整理总结(一)Java 基础
查看>>
Android 面试题整理总结(二)Java 集合
查看>>
学习笔记_vnpy实战培训day02
查看>>
学习笔记_vnpy实战培训day03
查看>>
VNPY- VnTrader基本使用
查看>>
VNPY - CTA策略模块策略开发
查看>>