模式设计的秘密之模板方法模式
来源:互联网 发布:百度云 seo 编辑:程序博客网 时间:2024/05/19 19:44
前言:先说说实际生活中的例子吧,比如我们去银行办理业务,通常会经历一下几个步骤。(1)拿号;(2)填写业务单;(3)等待叫号;(4)去柜台办理自己的业务。步骤一和三对每个普通的银行客户来说都是差不多的,而步骤二和四会因为个体的不同而有所不同,比如有人去存钱,有人去取钱,有人去办卡或者是找回自己的银行卡密码等等。再举一个例子,在举办奥运会开模式的时候,基本上回经历如下几个步骤。(1)升国旗;(2)重要的人讲话;(3)主办国的文艺汇演;(4)运动员入场;(5)点燃奥运圣火;步骤一,二和四基本上都是每一届奥运会差不多的,二步骤三和五是最能够展现一个主办国的风采的。
一.什么是模板方法模式?
核心是大的逻辑已经定义好了,你要做的就是一些具体的实现而已。也就是说在基类中定义好了模板的步骤的逻辑实现,子类只需要写一些具体的实现即可。
二.模板方法模式的结构?
AbstractTemplate(抽象模板):定义了完整的框架后,方法的调用顺序通常已经确定,但是还是会定义一些抽象的方法让之类去实现。
ConcreteTemplete(具体模板实现类):实现抽象类中定义的抽象方法,实现具体的功能,组成一个完整的逻辑。
三.模板方法模式的代码实现(java)
package com.imooc.pattern.template;/* * 抽象基类,为所有子类提供一个算法框架 * * 提神饮料 */public abstract class RefreshBeverage {/* * 制备饮料的模板方法 * 封装了所有子类共同遵循的算法框架 */public final void prepareBeverageTemplate(){//步骤1 将水煮沸boilWater();//步骤2 泡制饮料brew();//步骤3 将饮料倒入杯中pourInCup();if(isCustomerWantsCondiments()){//步骤4 加入调味料addCondiments();}}/* * Hook, 钩子函数,提供一个默认或空的实现 * 具体的子类可以自行决定是否挂钩以及如何挂钩 * 询问用户是否加入调料 */ protected boolean isCustomerWantsCondiments() {return true;}/* * 基本方法,将水煮沸 */private void boilWater() {System.out.println("将水煮沸");}/* * 基本方法,将饮料倒入杯中 */private void pourInCup() {System.out.println("将饮料倒入杯中");}/* * 抽象的基本方法,泡制饮料 */protected abstract void brew();/* * 抽象的基本方法, 加入调味料 */protected abstract void addCondiments();}
package com.imooc.pattern.template;/* * 具体子类,提供了咖啡制备的具体实现 */public class Coffee extends RefreshBeverage {@Overrideprotected void brew() {System.out.println("用沸水冲泡咖啡");}@Overrideprotected void addCondiments() {System.out.println("加入糖和牛奶");}}
package com.imooc.pattern.template;/* * 具体子类,提供了制备茶的具体实现 */public class Tea extends RefreshBeverage {@Overrideprotected void brew() {System.out.println("用80度的热水浸泡茶叶5分钟");}@Overrideprotected void addCondiments() {System.out.println("加入柠檬");}@Override/* * 子类通过覆盖的形式选择挂载钩子函数 * @see com.imooc.pattern.template.RefreshBeverage#isCustomerWantsCondiments() */protected boolean isCustomerWantsCondiments(){return false;}}
package com.imooc.pattern.template;public class RefreshBeverageTest {public static void main(String[] args) {System.out.println("制备咖啡...");RefreshBeverage b1 = new Coffee();b1.prepareBeverageTemplate();System.out.println("咖啡好了!");System.out.println("\n******************************************");System.out.println("制备茶...");RefreshBeverage b2 = new Tea();b2.prepareBeverageTemplate();System.out.println("茶好了!");}}
四.模板方法的优缺点?
优点:(1)封装性好,屏蔽很多细节;(2)复用性高;(3)便于维护。
缺点:因为它实现的机制是子类继承一个抽象类,而java只支持单继承,对于一些问题就会有局限性!
四.模板方法模式的应用场景?
在我们实际开发中的系统中,用到的框架很多都是用到了设计模式,我们只需要配置一下,写写核心的业务代码就可以了,很多事情框架都帮我们做了,框架在调用的过程中很多就用到了模板方法的设计模式。比如Spring MVC中的抽象类AbstractHandlerMapping,AbstractView等等。还有我们对各种日志的处理,也可以用模板设计模式来抽象提取,对文件的操作等等.....
- 模式设计的秘密之模板方法模式
- 设计模式的学习之路--模板方法设计模式
- 设计模式之模板方法模式模板方法模式
- 设计模式之模板方法
- 设计模式之模板方法
- 设计模式之模板方法
- 设计模式之模板方法
- 设计模式之模板方法
- 设计模式之模板方法
- 设计模式之模板方法
- 设计模式之模板方法
- 设计模式之模板方法
- 设计模式之模板方法
- 设计模式之模板方法
- 设计模式之模板方法
- 设计模式之模板方法
- 设计模式之模板方法
- 设计模式之模板方法
- RPC基础
- ODOO8 按钮权限更改(3)
- 白话陈述之——从python脚本变化解析由路径引起的GP服务运行失败问题
- Java集合类: Set、List、Map、Queue使用场景梳理(转自博客园LittleHann)
- Python 初学(4)——再谈字符串
- 模式设计的秘密之模板方法模式
- RPC提高
- map的使用
- android 判断 activity 状态
- C++打印地址
- 去哪网实习总结:JAVA读XML文件节点信息(JavaWeb)
- 自己写Android图片缓存框架之一级内存缓存
- TCP协议中的三次握手及四次握手图解
- s3c6410移植android-kernel-2.6.35内核不识别DM9000网卡