概述:

定义一个功能的框架(骨架),一部分功能是确定的,一部分功能是不确定的,先把确定的部分实现,把不确定的部分延迟到子类中实现。

实现该模式的关键步骤:

第一步:抽象类,实现模板方法,定义功能(确定的以及不确定的)的框架。

第二步:具体类,实现抽象类中的抽象方法,已完成完整的功能。

老规矩,最近想整一台BMW1系,去了趟4S店,店里恰好有一台现车,但颜色我不太喜欢,这时服务顾问上来解释说:“先生,您看中的这台车就这一个型号,外观,发动机,内饰等配置都是一样的,但颜色是可以个性化定制的,所以这个您不用担心”。这里大家该明白了,这就是一个典型的模板方法了,确定的功能是发动机,外观,内饰等,不确定的就是颜色了。那我们就开始代码实现了,毕竟作为程序员,只有敲好了代码才买得起宝马啊:

第一步:抽象类,定义功能框架

 abstract class BuyCar{
public void buy(){
//确定的功能
System.out.println("欢迎来到宝马4S店,我给你介绍下你选的这款车");
System.out.println("外观:两厢,家族式双肾栅格,典型的宝马脸");
System.out.println("发动机:2.0L双涡管单涡轮增压发动机");
System.out.println("内饰:。。。。。。。。");
System.out.println("这款车整体请看就是这样,但颜色可以选择,你想要白色还是红色呢?");
//不确定的功能选项
chooseColor();
}
//对不确定功能定义抽象方法供具体类实现
public abstract void chooseColor();
}

第二步:具体类,实现抽象方法

 class Man extends BuyCar{
public void chooseColor(){
System.out.println("白色的");
}
}

测试类:

 public class TemplateMethod{
public static void main(String[] args){
Man m = new Man();
m.buy();
}
}

输出结果:

 欢迎来到宝马4S店,我给你介绍下你选的这款车
外观:两厢,家族式双肾栅格,典型的宝马脸
发动机:2.0L双涡管单涡轮增压发动机
内饰:。。。。。。。。
这款车整体请看就是这样,但颜色可以选择,你想要白色还是红色呢?
白色的

就这样,我的购车之旅就结束了。也对模板方法有了新的感悟:

该模式有他的优点,比如说:

(1)模板方法模式通过把不变的行为搬移到超类,去除了子类中的重复代码。

(2)子类实现算法的某些细节,有助于算法的扩展。

(3)通过一个父类调用子类实现的操作,通过子类扩展增加新的行为,符合“开放-封闭原则”。

但是缺点也同样明显:每个不同的实现都需要定义一个子类,这会导致类的个数的增加,设计更加抽象。

JAVA模板方法设计模式(从现实生活角度理解代码原理)的更多相关文章

  1. JAVA适配器模式(从现实生活角度理解代码原理)

    说道JAVA中的适配器模式,不得不引用该设计模式的固定表述"适配器模式(Adapter ):将一个类的接口转换成客户希望的另外一个接口,适配器模式使得原本由于接口不兼容而不能一起工作的那些类 ...

  2. JAVA装饰者模式(从现实生活角度理解代码原理)

    装饰者模式可以动态地给一个对象添加一些额外的职责.就增加功能来说,Decorator模式相比生成子类更为灵活. 该模式的适用环境为: (1)在不影响其他对象的情况下,以动态.透明的方式给单个对象添加职 ...

  3. JAVA简单工厂模式(从现实生活角度理解代码原理)

    简单工厂模式(Simple Factory),说他简单是因为我们可以将此模式比作一个简单的民间作坊,他们只有固定的生产线生产固定的产品.也可以称他为静态工厂设计模式,类似于之前提到过静态代理设计模式, ...

  4. JAVA动态代理模式(从现实生活角度理解代码原理)

    所谓动态代理,即通过代理类:Proxy的代理,接口和实现类之间可以不直接发生联系,而可以在运行期(Runtime)实现动态关联. java动态代理主要是使用java.lang.reflect包中的两个 ...

  5. JAVA静态代理模式(从现实生活角度理解代码原理)

    代理模式(Proxy):为其他对象提供一种代理以控制对这个对象的访问. 代理模式说白了就是"真实对象"的代表,在访问对象时引入一定程度的间接性,因为这种间接性可以附加多种用途. 在 ...

  6. 【C#硬件角度理解代码】函数

    函数的执行过程

  7. java常量,变量,静态变量的理解

    最近考试出了一个很简单的题,看看他们对java常量,变量,静态变量的理解,代码如下: public class TestVar { /** * JAVA基础,常量,变量,静态变量 */ public ...

  8. 从源码角度理解Java设计模式——装饰者模式

    一.饰器者模式介绍 装饰者模式定义:在不改变原有对象的基础上附加功能,相比生成子类更灵活. 适用场景:动态的给一个对象添加或者撤销功能. 优点:可以不改变原有对象的情况下动态扩展功能,可以使扩展的多个 ...

  9. Java抽象类深入理解-----模板方法设计模式(Templete Method)

    模板方法设计模式(Templete Method) 定义一个操作中的算法骨架,而将一些可变部分的实现延迟到子类中. 模板方法设计模式使得子类可以不改变一个算法的结构即可重新定义该算法某些特定的步骤. ...

随机推荐

  1. lintcode 落单的数(位操作)

    题目1 落单的数 给出2*n + 1 个的数字,除其中一个数字之外其他每个数字均出现两次,找到这个数字. 链接:http://www.lintcode.com/zh-cn/problem/single ...

  2. .Net 转战 Android 4.4 日常笔记(5)--新软件Android Studio 0.5.8安装与配置及问题解决

    说真心话,Eclipse跟我们.net的VS比起来就是屌丝比高富帅,一切都是那么的难用,速度慢得我无法忍受 于是想试试Google钦点的Android Studio IDE工具,这跟ADT一样也是一套 ...

  3. Java 8新特性-4 方法引用

    对于引用来说我们一般都是用在对象,而对象引用的特点是:不同的引用对象可以操作同一块内容! Java 8的方法引用定义了四种格式: 引用静态方法     ClassName :: staticMetho ...

  4. IOS开发之记录用户登陆状态

    上一篇博客中提到了用CoreData来进行数据的持久化,CoreData的配置和使用步骤还是挺复杂的.但熟悉CoreData的使用流程后,CoreData还是蛮好用的.今天要说的是如何记录我们用户的登 ...

  5. ASP.NET 字符编码的那些事

    ASP.NET 中的字符编码问题,一般会有两个场景: HTML 编码:一般是动态显示 HTML 字符或标签,写法是:HttpUtility.HtmlDecode(htmlString) 或 Html. ...

  6. Azure Application Gateway (3) 设置URL路由

    <Windows Azure Platform 系列文章目录> 在之前的文章中,笔者介绍了Azure Web App可以设置URL路由.如下图: 在这里笔者简单介绍一下,首先我们还是创建以 ...

  7. struts2学习笔记--动手搭建环境+第一个helloworld项目

    在Myeclipse中已经内置好了struts2的环境,但是为了更好的理解,这里自己从头搭建一下: 前期准备:下载struts2的完整包,下载地址:https://struts.apache.org/ ...

  8. Ueditor 增加模板

    简介: Ueditor 是百度出的开源富文本编辑器,非常符合国人习惯!模板功能很好用. 官网:http://ueditor.baidu.com/website/ 定义自己的模板: 先用Ueditor编 ...

  9. MFC&Halcon之图片显示

    上一篇介绍了MFC调用Halcon功能的简单例子,在这个例子中,点击按钮会弹出一个窗口显示图片,但是这样显示并不美观,而且...于是我决定把显示窗口做在MFC的窗体内部. 具体的方案是:使用一个Pic ...

  10. 细说Cookie

    阅读目录 开始 Cookie 概述 Cookie的写.读过程 使用Cookie保存复杂对象 Js中读写Cookie Cookie在Session中的应用 Cookie在身份验证中的应用 Cookie的 ...