设计模式解密(4)- 模板方法模式

1、简介

定义:一个操作中算法的框架,而将一些步骤延迟到子类中,使得子类可以不改变算法的结构即可重定义该算法中的某些特定步骤。

模板方法模式,一般是为了统一子类的算法实现步骤,所使用的一种手段或者说是方式。它在父类中定义一系列算法的步骤,而将具体的实现都推迟到子类。

最典型的形式就是一个接口,一个抽象父类,父类中会有一系列的抽象方法,而在子类中去实现这些方法。

类型:行为类模式

2、实例引入

背景:学校老师布置作业,老师布置作业,学生写作业,老师检查作业

定义一个抽象作业类

package com.designpattern.templete;
/**
* 类说明 :学校教师作业
*/
public abstract class Homeork {

	final void workflow(){
		//老师布置作业
		this.assginHomework();
		//学生 做 作业
		this.doHomework();
		//老师检查作业
		this.checkHomework();
	}

	//布置作业
	void assginHomework(){
		System.out.println("回家做课后习题,明天检查!");
	}

	//学生 做 作业
	abstract void doHomework();

	//检查作业
	void checkHomework(){
		System.out.println("检查作业!");
	}
}

A同学完成写作业部分(只关心写作业的部分)

package com.designpattern.templete;
/**
* 类说明 :A同学完成作业类
*/
public class StudentA extends Homeork{

	@Override
	void doHomework() {
		//TODO 业务
		System.out.println("A同学是这样完成作业的!");
	}
}

B同学完成写作业部分(只关心写作业的部分)

package com.designpattern.templete;
/**
* 类说明 :B同学完成作业类
*/
public class StudentB extends Homeork{

	@Override
	void doHomework() {
		// TODO 业务
		System.out.println("B同学是这样完成作业的!");
	}
}

测试 A、B同学完成作业的过程

package com.designpattern.templete;
/**
* 类说明 :测试
*/
public class Test {

	public static void main(String[] args) {
		//测试一次完成作业: 同学都是怎么样完成作业的
		StudentA A = new StudentA();
		A.workflow();

		System.out.println("---------------------");

		StudentB B = new StudentB();
		B.workflow();
	}
}

结果

回家做课后习题,明天检查!
A同学是这样完成作业的!
检查作业!
---------------------
回家做课后习题,明天检查!
B同学是这样完成作业的!
检查作业!

3、解决的问题

上面的例子: 学校作业的流程都是一样的,只是学生做作业是五花八门的 ,所以把确定的部分提取到抽象父类中,可变的部分有子类完成;

学生不需要操作怎么布置作业,怎么检查作业,只需要把自己的任务 --- 写作业,  完成就行了。

4、应用场景

在多个子类拥有相同的方法,并且这些方法逻辑相同时,可以考虑使用模版方法模式。在程序的主框架相同,细节不同的场合下,也比较适合使用这种模式。

引用:大部分刚步入职场的毕业生应该都有类似的经历。一个复杂的任务,由公司中的牛人们将主要的逻辑写好,然后把那些看上去比较简单的方法写成抽象的,交给其他的同事去开发。这种分工方式在编程人员水平层次比较明显的公司中经常用到。比如一个项目组,有架构师,高级工程师,初级工程师,则一般由架构师使用大量的接口、抽象类将整个系统的逻辑串起来,实现的编码则根据难度的不同分别交给高级工程师和初级工程师来完成。怎么样,是不是用到过模版方法模式?

5、优缺点

优点:

容易扩展:一般来说,抽象类中的模版方法是不易反生改变的部分,而抽象方法是容易反生变化的部分,因此通过增加实现类一般可以很容易实现功能的扩展,符合开闭原则。

便于维护:对于模版方法模式来说,正是由于他们的主要逻辑相同,才使用了模版方法,假如不使用模版方法,任由这些相同的代码散乱的分布在不同的类中,维护起来是非常不方便的。

缺点:

子类的实现也可以影响父类中主逻辑的运行,在灵活的同时,由于子类影响到了父类,违反了里氏替换原则,也会给程序带来风险。这就对抽象类的设计有了更高的要求。

6、总结

一次性实现一个算法的不变的部分,并将可变的行为留给子类来实现;

各子类中公共的行为应被提取出来并集中到一个公共父类中以避免代码重复;

控制子类的扩展;

在多个子类拥有相同的方法,并且这些方法逻辑相同时,可以考虑使用模版方法模式。在程序的主框架相同,细节不同的场合下,也比较适合使用这种模式。

PS:源码地址   https://github.com/JsonShare/DesignPattern/tree/master

时间: 2024-10-30 06:22:32

设计模式解密(4)- 模板方法模式的相关文章

设计模式C++实现——模板方法模式

模式定义: 模板方法模式在一个方法中定义了一个算法的骨架,而将一些步骤延迟到子类中.模板方法使得子类可以在不改变算法结构的情况下,重新定义算法中的某些步骤. 模板就是一个方法.更具体的说,这个方法将算法定义成一组步骤,其中的任何步骤都可以是抽象的,由子类实现.这可以确保算法的结果保持不变,同时由子类提供部分实现. 模式结构: 举例: 泡咖啡和泡茶步骤与基本相同,定义咖啡和茶的类如下: class Coffee { public: void prepareRecipe() { boilWater(

设计模式--15、模板方法模式

设计模式学习笔记-模板方法模式 1. 概述 定义一个操作中的算法的骨架,而将步骤延迟到子类中.模板方法使得子类可以不改变一个算法的结构即可重定义算法的某些特定步骤. 2. 模式中的角色 2.1 抽象类(AbstractClass):实现了模板方法,定义了算法的骨架. 2.2 具体类(ConcreteClass):实现抽象类中的抽象方法,已完成完整的算法. 3. 模式解读 3.1 模板方法类图 3.2 模板方法模式代码实现 /// <summary> /// 抽象类 /// </summa

设计模式入门之模板方法模式TemplateMethod

模板方法模式定义: 定义一个算法的骨架,而将步骤延迟到子类中.这种模式可以使得在不改变算法骨架(模板)的情况下修改每个步骤的具体实现 从功能上来看,这个模式跟生成器模式有些相像,只不过生成器模式定义了创建对象的过程,而模板方法模式定义了算法过程 感觉这个模式要简单很多. 钩子:可以被子类覆盖以实现扩展的方法通常叫做钩子 实例:用户登录过程,分为后台人员登录和用户登录,这是一个非常成型的技术过程,是非常典型的模板方法模式的应用,其中普通用户密码不需要加密,而工作人员的密码需要进行加密比对.上代码

设计模式学习之模板方法模式(TemplateMethod,行为型模式)(9)

一.什么是模板方法模式 Template Method模式也叫模板方法模式,是行为模式之一,它把具有特定步骤算法中的某些必要的处理委让给抽象方法,通过子类继承对抽象方法的不同实现改变整个算法的行为. 二.模板方法模式的应用场景 Template Method模式一般应用在具有以下条件的应用中: - 具有统一的操作步骤或操作过程 - 具有不同的操作细节 - 存在多个具有同样操作步骤的应用场景,但某些具体的操作细节却各不相同 private static void Main(string[] arg

C#设计模式之十三模板方法模式(Template Method Pattern)【行为型】

原文:C#设计模式之十三模板方法模式(Template Method Pattern)[行为型] 一.引言 "结构型"的设计模式已经写完了,从今天我们开始讲"行为型"设计模式.现在我们开始讲[行为型]设计模式的第一个模式,该模式是[模板方法],英文名称是:Template Method Pattern.还是老套路,先从名字上来看看."模板方法"我第一次看到这个名称,我的理解是,有一个方法的名字叫"模板方法",后来深入学习之后,

c#设计模式系列:模板方法模式(Template Method Pattern)

引言 提到模板,大家肯定不免想到生活中的"简历模板"."论文模板"."Word中模版文件"等,在现实生活中,模板的概念就是--有一个规定的格式,然后每个人都可以根据自己的需求或情况去更新它,例如简历模板,下载下来的简历模板的格式都是相同的,然而我们下载下来简历模板之后我们可以根据自己的情况填充不同的内容要完成属于自己的简历.在设计模式中,模板方法模式中模板和生活中模板概念非常类似,下面让我们就详细介绍模板方法的定义,大家可以根据生活中模板的概念来

设计模式之禅-模板方法模式

个人Blog 此篇博文所在地址:http://www.sanyinchenblog.com/?p=273 模板方法模式: 定义一个操作中的算法框架,将一些步骤延迟到子类中.使得子类可以不改变    一个算法的结构即可重定义该算法的某些特定步骤. Demo: https://github.com/sanyinchen/UMLDemo/tree/master/src/com/sanyinchen/templete https://github.com/sanyinchen/UMLDemo/tree/

Java设计模式(四) 之 模板方法模式

源码均以JDK1.8作为参考 1.定义: 定义一个操作中的算法的框架,而将一些步骤延迟到子类中.使得子类可以不改变一个算法的机构即可重定义该算法的某些特定步骤. 2.解析: 通用类图: 类图解析: 模板方法模式非常简单,仅仅使用了Java的继承机制,但它是一个应用非常广泛的模式. 2.1.抽象模板(AbstractClass) 主要定义了模板中一些基本操作(方法),它的方法分为两类: 基本方法: 基本方法也叫基本操作,是由子类实现的方法,并且被模板方法被调用. 模板方法: 可以由一个或几个,一般

《Java设计模式》之模板方法模式

模板方法模式是类的行为模式.准备一个抽象类.将部分逻辑以详细方法以及详细构造函数的形式实现,然后声明一些抽象方法来迫使子类实现剩余的逻辑.不同的子类能够以不同的方式实现这些抽象方法,从而对剩余的逻辑有不同的实现.这就是模板方法模式的用意. 模板方法模式的结构 模板方法模式是全部模式中最为常见的几个模式之中的一个.是基于继承的代码复用的基本技术. 模板方法模式须要开发抽象类和详细子类的设计师之间的协作.一个设计师负责给出一个算法的轮廓和骨架,还有一些设计师则负责给出这个算法的各个逻辑步骤.代表这些

调侃《Head First设计模式》之模板方法模式

现在有两个人,一个爱喝咖啡,一个爱喝茶,让我们用代码创建咖啡和喝茶: 咖啡类: 茶类: 很容易发现,咖啡喝茶的代码有惊人的相似. 经过之前设计模式的阅读,你应该已经有意识的把相同的部分抽取出来.pourInCup和boilWater方法相同,于是可以考虑将它们整合到一个公共的类中,我们可以这样设计: CaffeineBeverage是一个公共类,咖啡喝茶是它的子类,继承了相同的方法. 等下,难道相同的部分就这样?no. brewCoffeeGrinds()和steepTeaBag()两个方法,一