设计模式—模板方法

一、模板方法的定义

Template Method Pattern:Definethe skeleton of an algorithm in an operation,deferring some steps tosubclasses.Template Methodletssubclasses redefine certain steps of an algorithmwithoutchanging the algorithm‘s structure.

定义一个操作中算法的骨架,将一些步骤的执行延迟到子类,模板方法让子类在不改变算法的结构下重新定义一个算法的步骤。

二、模板方法的应用场景

根据模板方法的定义,定义一个操作中的算法的骨架,其实就是在抽象类中定义一个模板方法,该模板方法里面会有一系列的方法的执行步骤,其中有些方法是该抽象类中的方法,它是所有子类公用的方法,有些方法是需要在子类中去实现的方法。因此,模板方法通常使用在,对于不同类型的他们具有相同的执行步骤,并且他们具有部分相同的行为。我们可以将相同的行为提取到抽象父类中去实现,不同的行为留给子类实行,从而实现代码的复用。模板方法是基于继承实现的代码复用技术。下面我们将通过一个例子来理解模板方法的使用。

三、模板方法示例

现在假设我们需要构造一个建造房子的算法。建造一个房子需要包含以下几个步骤:

建地基 、建柱子、砌墙及建窗户。 假设这些步骤的执行顺序不能颠倒,及建地基必须在前其次建柱子,砌墙在建窗户,实际建房子其实也是这个基本步骤来的,那么下面我需要建两种类型的房子,一个是木房,一个是玻璃房。并且建地基和窗户是两种房子的共同的行为。那么下面我们将通过模板方法来实现这个过程。

 1 public abstract class HouseTemplate {
 2
 3      public final void buildHouse(){
 4             buildFoundation();
 5             buildPillars();
 6             buildWalls();
 7             buildWindows();
 8             System.out.println("House is built.");
 9         }
10
11      private void buildFoundation()
12      {
13          System.out.println("build foundation");
14      }
15      private void buildWindows()
16      {
17          System.out.println("build windows");
18      }
19
20      protected abstract void buildPillars();
21
22      protected abstract void buildWalls();
23
24 

25 }
 1 public class GlassHouse extends HouseTemplate{
 2
 3     @Override
 4     protected void buildPillars() {
 5         System.out.println("Building Glass Walls");
 6
 7     }
 8
 9     @Override
10     protected void buildWalls() {
11         System.out.println("Building Pillars with glass coating");
12
13     }
14
15 }
public class WoodenHouse extends HouseTemplate{

	@Override
	protected void buildPillars() {
		System.out.println("Building Wooden Walls");

	}

	@Override
	protected void buildWalls() {
		System.out.println("Building Pillars with Wood coating");

	}

}
 1 public class HousingClient {
 2
 3     public static void main(String args[])
 4     {
 5          HouseTemplate houseType = new WoodenHouse();
 6
 7             //using template method
 8             houseType.buildHouse();
 9             System.out.println("************");
10
11             houseType = new GlassHouse();
12
13             houseType.buildHouse();
14     }
15
16 }

程序的输出结果如下:
build foundation
Building Wooden Walls
Building Pillars with Wood coating
build windows
House is built.
************
build foundation
Building Glass Walls
Building Pillars with glass coating
build windows
House is built.

在抽象的父类中我们定义了buildHouse这个模板方法,该模板方法定义了算法的骨架,并将对buildPillars 和buildWalls的执行延迟到子类中执行。并且该模板方法被定义成final的,防止子类覆写来改变父类的行为,从而违反“开闭原则”。

四、模板方法总结

1)模板方法模式是一种类的行为型模式,在它的结构图中只有类之间的继承关系,没有对象关联关系。

2)板方法模式是基于继承的代码复用基本技术,模板方法模式的结构和用法也是面向对象设计的核心之一。在模板方法模式中,可以将相同的代码放在父类中,而将不同的方法实现放在不同的子类中。

3)在模板方法模式中,我们需要准备一个抽象类,将部分逻辑以具体方法的形式实现,然后声明一些抽象方法来让子类实现剩余的逻辑。不同的子类可以以不同的方式实现这些抽象方法,从而对剩余的逻辑有不同的实现,这就是模板方法模式的用意。模板方法模式体现了面向对象的诸多重要思想,是一种使用频率较高的模式。

4)在大多数情况下都是子类调用父类方法,但是在模板方法中时父类调用子类的方法,这通常被称作 Hollywood Principle,—— 不要打电话给我,我将打电话给你。

时间: 2024-12-21 23:33:12

设计模式—模板方法的相关文章

设计模式 - 模板方法模式(template method pattern) JFrame 详解

模板方法模式(template method pattern) JFrame 详解 本文地址: http://blog.csdn.net/caroline_wendy 参考模板方法模式(template method pattern): http://blog.csdn.net/caroline_wendy/article/details/32159455 模板方法模式(template method pattern), Java的JFrame使用模板方法模式, paint()是可以覆盖的方法,

设计模式 - 模板方法模式(template method pattern) Applet 详解

模板方法模式(template method pattern) Applet 详解 本文地址: http://blog.csdn.net/caroline_wendy 参考模板方法模式(template method pattern): http://blog.csdn.net/caroline_wendy/article/details/32159455 模板方法模式(template method pattern), applet就是一个能够在网页上面执行的小程序, applet有很多钩子(

设计模式 - 模板方法模式(template method pattern) 排序(sort) 详解

模板方法模式(template method pattern) 排序(sort) 详解 本文地址: http://blog.csdn.net/caroline_wendy 参考模板方法模式(template method pattern): http://blog.csdn.net/caroline_wendy/article/details/32159455 模板方法模式的一个主要的应用是排序(sort)算法. 对象的排列方式并不是完全相同, 所以需要排序(sort)算法compareTo()

说说优秀设计模式--模板方法

说说优秀设计模式--模板方法说说优秀设计模式--模板方法(Template Method) 2016-1-1 by Damon 说说模板方法(Template Method) 一句话总结 父类方法调用抽象方法,方法抽象定义在父类,实际实现处理交给子类,按照流程完成整件事就是"模板方法模式". 有什么好处 遵照父类定义的前提下,不同的子类可以给父类抽象的模板方法提供不同的实现,提供拓展能力. 简单的小例子 父类:AbstractDisplay     public abstract cl

设计模式 - 模板方法模式(template method pattern) 详解

模板方法模式(template method pattern) 详解 本文地址: http://blog.csdn.net/caroline_wendy 模板方法模式(template method pattern): 在一个方法中定义一个算法的骨架, 而将一些步骤延迟到子类中. 模板方法使得子类可以在不改变算法结构的情况下, 重新定义算法中的某些步骤. 模板方法可以进行挂钩(hook), 钩子(hook)是一种被声明在抽象类中的方法, 但只有空的或者默认的实现. 钩子的存在, 可以让子类有能力

结合JDK源码看设计模式——模板方法模式

前言: 相信很多人都听过一个问题:把大象关进冰箱门,需要几步? 第一,把冰箱门打开:第二,把大象放进去:第三,把冰箱门关上.我们可以看见,这个问题的答案回答的很有步骤.接下来我们介绍一种设计模式--模板方法模式,你会发现,它与这个问题的答案实际上有很多共同之处. 一.定义 定义一个算法骨架,允许子类为一个或多个步骤提供实现.模板方法使得子类可以在不改变算法结构的情况下,重新定义算法的某些步骤. 二.适用场景 一次性实现一个算法的不变的部分,将可变的行为留给子类实现 也就是将各子类中公共行为被提取

java设计模式 模板方法模式Template Method

设计模式(Design pattern)是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结.使用设计模式是为了可重用代码.让代码更容易被他人理解.保证代码可靠性.毫无疑问,设计模式于己于他人于系统都是多赢的,设计模式使代码编制真正工程化,设计模式是软件工程的基石,如同大厦的一块块砖石一样.项目中合理的运用设计模式可以完美的解决很多问题,每种模式在现在中都有相应的原理来与之对应,每一个模式描述了一个在我们周围不断重复发生的问题,以及该问题的核心解决方案,这也是它能被广泛应用的原因.

Java设计模式--模板方法模式

定义: 模板模式是一种行为设计模式,使用了JAVA的继承机制,在抽象类中定义一个模板方法,该方法引用了若干个抽象方法(由子类实现)或具体方法(子类可以覆盖重写).它的实现思路是,创建一个桩方法,并且定义一些步骤让子类来实现.模板方法定义了一个算法的执行步骤,或者说能够提供一种默认的实现,这种实现概括一部分子类或者全部子类的共同部分. 举一个例子帮助理解,假设提供一种造房子的算法.算法的步骤就是模拟造房子的过程:建地基.建支撑,最后添加墙和窗户 – 1. Fundation,2. Pillars,

大话设计模式-->模板方法设计模式

在学习java的过程中,我们肯定听到过设计模式这名词,在行业中有这么一句话,若您能熟练的掌握23种设计模式,那么你便是大牛! 好了,废话不多说,今天我跟大家分享一下23种设计模式之一的  模板方法 设计模式 首先我们要知道什么是模板方法设计模式? 模板方法设计模式就是定义一个操作中的算法骨架,而将一些实现步骤延迟到子类当中.模板方法使得子类可以在不改变算法结构的情况下,重新定义算法中的某些步骤. 为什么要使用模板方法设计模式? 模板方法模式是比较简单的一种设计模式,但是它却是代码复用的一项基本的

大话设计模式—模板方法模式

在模板方法模式(TemplateMethod Pattern)中,一个抽象类公开定义了执行它的方法的方式/模板.它的子类可以按需要重写方法实现,但调用将以抽象类中定义的方式进行.这种类型的设计模式属于行为型模式. 大话设计模式中程杰老师给出的定义是:模板方法模式:定义一个操作中的算法的骨架,而将一些步骤延迟到子类中.模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤. 有一个经常用到的实例就是Spirng 中对 Hibernate 的支持,将一些已经定好的方法封装起来,比如开