一.概念
模板方法模式在一个方法中定义一个算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以在不改变算法结构的情况下,重新定义算法中的某些步骤。
二.UML
- AbstractClass(定义了算法的骨架)。
- ConcreteClass(定义了算法估计中具体算法的实现)。
三.实例分析
做菜,对我来说是相当的简单。我做菜,都是一个流程:洗菜-放油-放菜-放盐-小炸一下-小煮一下-...。做鱼和做肉,除了最后鱼肉的差别外,其它的辣椒颜色,味道什么的,毫无差别。就拿这个例子来说明今天的模式。
Cook
package com.zzy.templateMethod;
/**
* 做菜
* @author eason
*
*/
public abstract class Cook {
//final以免子类改变这个方法的顺序
//我觉得是没必要的,子类不会关注cook方法,
//只会关注cook里面调用的每一个方法
public final void cook() {
prepare();
putOil();
putFood();
putCondiments();
waitAMoment();
if(!tasteDelicious()) {
doOtherThings();
}
}
//准备工作
public void prepare(){
System.out.println("买菜洗菜等装备工作");
}
//放油
public abstract void putOil();
//放菜
public abstract void putFood();
//放作料
public void putCondiments() {
System.out.println("放盐,酱油,醋");
}
//等待
public abstract void waitAMoment();
//品尝是否美味,默认美味,子类不需要重写此方法
//如果不美味,子类重写此方法即可
public boolean tasteDelicious(){
return true;
}
//做点其它的事情,让味道更好
public void doOtherThings(){
}
}
CookFish
package com.zzy.templateMethod;
/**
* 做鱼
* @author eason
*
*/
public class CookFish extends Cook {
@Override
public void putOil() {
System.out.println("放花生油");
}
@Override
public void putFood() {
System.out.println("放鱼");
}
@Override
public void waitAMoment() {
System.out.println("等待十分钟");
}
}
CookEgg
package com.zzy.templateMethod;
/**
* 做鸡蛋
* @author eason
*
*/
public class CookEgg extends Cook {
@Override
public void putOil() {
System.out.println("放猪油");
}
@Override
public void putFood() {
System.out.println("放鸡蛋");
}
@Override
public void waitAMoment() {
System.out.println("等待四分钟");
}
@Override
public boolean tasteDelicious() {
return false;
}
@Override
public void doOtherThings(){
System.out.println("做点其它的事情,让味道更好");
}
}
TestTemplateMethod
package com.zzy.templateMethod;
/**
* 测试类
* @author eason
*
*/
public class TestTemplateMethod {
public static void main(String[] args) {
Cook fish = new CookFish();
fish.cook();
Cook egg = new CookEgg();
egg.cook();
}
}
四.使用场景及使用感受
- 模板定义了一系列算法的步骤,这一系列算法中肯定有一个抽象的算法,也就是模板方法是一个工作的概要,至于一套完完整整的工作,是需要子类来参与的。
- 如果对这一系列的算法,有些子类不需要其中的某一个或者某一些算法,可以用"挂钩"来实现,钩子说明了算法的可选性。模板类里面定义这些算法的默认实现或者空实现,子类有需要的话就重写这些算法。如上述中的tasteDelicious方法和doOtherThings方法。
- 当不变的和可变的方法在子类实现中混在一起的时候,不变的行为就会在子类中重复出现。通过模板方法模式把这些不变的行为搬到单一的地方,可以帮助子类摆脱重复的不变行为的纠缠。
分享到:
相关推荐
Python的设计哲学强调代码的可读性和简洁的语法(尤其是使用空格缩进来区分代码块,而不是使用大括号或关键词)。这使得Python被认为是一种易于学习的语言,同时具备强大的功能,适合初学者和经验丰富的程序员。 ...
模板方法模式是设计模式中的一种行为模式,它在软件工程中扮演着重要的角色,尤其是在C++这样的面向对象编程语言中。这种模式定义了一个操作中的算法骨架,而将一些步骤延迟到子类中。使得子类可以不改变一个算法的...
模板方法模式(Template Method)是设计模式中行为型模式的一种,它定义了操作中的算法骨架,而将一些步骤延迟到子类中。使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。这个模式在C++编程中有着...
- **为什么以及如何学习设计模式**:了解设计模式有助于提高代码质量,增强代码的可读性和可维护性。通过学习设计模式,开发者可以更好地理解软件架构,并能够快速地适应新的项目需求。 #### 软件设计原则 《深入...
### 设计模式之模板方法模式解析 #### 一、引言 在软件开发过程中,我们经常面临这样的场景:有一些步骤是固定的,而某些步骤则可能因具体实现而异。为了解决这类问题,设计模式中引入了一种叫做“模板方法模式”的...
模板方法模式是设计模式中行为模式的一种,它在软件开发中起到了重要的作用,尤其是在复杂的系统设计中。模板方法模式遵循“开闭原则”,允许我们定义一个算法的骨架,同时允许子类在不改变整体结构的情况下,对算法...
Java 经典设计模式讲解以及项目实战 设计模式简介:主要介绍各种设计模式的概念和运用场景等 设计模式综合运用:主要是笔者在实际工作中运用到的一些设计模式综合运用事例的提炼 Spring设计模式简介:主要是讲述...
在“设计模式学习模板demo”中,我们可以预见到这可能是一个包含了多种设计模式实际应用的示例项目。以下是一些常见的设计模式及其在实际编程中的应用: 1. **单例模式**:确保一个类只有一个实例,并提供全局访问...
《设计模式:可复用面向对象软件的基础》是一本经典的软件工程著作,它详细阐述了在面向对象编程中,如何通过使用预定义的解决方案模板来解决常见问题,从而提高代码的可读性、可维护性和复用性。设计模式是经验丰富...
模板方法模式是一种设计模式,属于行为设计模式,它在面向对象设计中被广泛使用,用于定义算法的骨架,而将一些步骤延迟到子类中。这样,模板方法使得子类可以在不改变算法结构的情况下,重新定义算法中的某些特定...
模板方法模式是一种设计模式,属于行为设计模式的范畴。它定义了操作中的算法骨架,而将一些步骤延迟到子类中。使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。 在Java或其他面向对象编程语言中...
### 设计模式学习报告 #### 一、设计模式概述 设计模式是一种被广泛接受和使用的编程解决方案,旨在解决软件设计中的常见问题。它不仅能够帮助开发者编写出更易于理解和维护的代码,还能够促进代码的复用性。设计...
《设计模式:可复用面向对象软件的基础》一书介绍了23种经典的设计模式,这些模式大致可以分为三大类: 1. **创建型模式**:专注于对象的创建机制,确保系统在合适的时机创建正确的对象。 - **单例模式**...
以上只是C#设计模式中的一部分,实际上还有许多其他模式,如命令模式、模板方法模式、迭代器模式等。学习和掌握这些模式,开发者可以更好地设计出可扩展、可维护的系统,提高代码质量。在C#中,由于语言特性的支持,...
模板方法模式是一种行为设计模式,它允许在定义行为框架的同时,延迟部分具体步骤到子类中实现。这种模式主要用于在父类中定义算法的骨架,而将一些步骤的实现细节留给子类去完成,从而使得不同的子类可以重用相同的...
设计模式课程设计模板通常包括一系列常见的设计模式及其应用实例,帮助学生或开发者系统地学习和掌握这些模式。 在这个"设计模式课程设计模板"中,我们可以期待学习到以下几个主要的知识点: 1. **设计模式分类**...
里面包含常规算法学习demo; 设计模式的分类 ...行为型模式,共十一种:策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式。
本教程旨在深入讲解设计模式的基本原理和应用方法,帮助开发者构建更加健壮和灵活的软件系统。 首先,我们要理解什么是设计模式。设计模式并非具体的代码或库,而是一种描述在特定环境下如何设计和实现软件组件的...