Carson带你学设计模式:模板方法模式(Template Method)
前言
今天Carson来全面总结最常用的设计模式 - 模板方法模式。
Carson带你学设计模式系列文章
Carson带你学设计模式:这是一份全面 & 详细的设计模式学习指南
Carson带你学设计模式:单例模式(Singleton)
Carson带你学设计模式:简单工厂模式(SimpleFactoryPattern)
Carson带你学设计模式:工厂方法模式(Factory Method)
Carson带你学设计模式:抽象工厂模式(Abstract Factory)
Carson带你学设计模式:建造者模式(Builder Pattern)
Carson带你学设计模式:适配器模式(Adapter Pattern)
Carson带你学设计模式:外观模式(Facade Pattern)
Carson带你学设计模式:静态代理模式(Proxy Pattern)
Carson带你学设计模式:动态代理模式(Proxy Pattern)
Carson带你学设计模式:模板方法模式(Template Method)
Carson带你学设计模式:策略模式(Strategy Pattern)
Carson带你学设计模式:观察者模式(Observer)
目录
1. 介绍
1.1 定义
定义一个模板结构,将具体内容延迟到子类去实现。
1.2 主要作用
在不改变模板结构的前提下在子类中重新定义模板中的内容。
模板方法模式是基于”继承“的;
1.3 解决的问题
- 提高代码复用性
将相同部分的代码放在抽象的父类中,而将不同的代码放入不同的子类中 - 实现了反向控制
通过一个父类调用其子类的操作,通过对子类的具体实现扩展不同的行为,实现了反向控制 & 符合“开闭原则”
2. 模式原理
2.1 UML类图 & 组成
2.2 实例讲解
接下来我用一个实例来对模板方法模式进行更深一步的介绍。
a. 实例概况
- 背景:小成希望学炒菜:手撕包菜 & 蒜蓉炒菜心
- 冲突:两道菜的炒菜步骤有的重复有的却差异很大,记不住
- 解决方案:利用代码记录下来
b. 使用步骤
步骤1: 创建抽象模板结构(Abstract Class):炒菜的步骤
public abstract class Abstract Class {
//模板方法,用来控制炒菜的流程 (炒菜的流程是一样的-复用)
//申明为final,不希望子类覆盖这个方法,防止更改流程的执行顺序 final void cookProcess(){ //第一步:倒油this.pourOil();//第二步:热油this.HeatOil();//第三步:倒蔬菜this.pourVegetable();//第四步:倒调味料this.pourSauce();//第五步:翻炒this.fry();} //定义结构里哪些方法是所有过程都是一样的可复用的,哪些是需要子类进行实现的//第一步:倒油是一样的,所以直接实现
void pourOil(){ System.out.println("倒油"); } //第二步:热油是一样的,所以直接实现void HeatOil(){ System.out.println("热油"); } //第三步:倒蔬菜是不一样的(一个下包菜,一个是下菜心)
//所以声明为抽象方法,具体由子类实现 abstract void pourVegetable();//第四步:倒调味料是不一样的(一个下辣椒,一个是下蒜蓉)
//所以声明为抽象方法,具体由子类实现 abstract void pourSauce();//第五步:翻炒是一样的,所以直接实现void fry();{ System.out.println("炒啊炒啊炒到熟啊"); }
}
步骤2: 创建具体模板(Concrete Class),即”手撕包菜“和”蒜蓉炒菜心“的具体步骤
//炒手撕包菜的类public class ConcreteClass_BaoCai extend Abstract Class{@Overridepublic void pourVegetable(){ System.out.println(”下锅的蔬菜是包菜“); } @Overridepublic void pourSauce(){ System.out.println(”下锅的酱料是辣椒“); }
}
//炒蒜蓉菜心的类public class ConcreteClass_CaiXin extend Abstract Class{@Overridepublic void pourVegetable(){ System.out.println(”下锅的蔬菜是菜心“); } @Overridepublic void pourSauce(){ System.out.println(”下锅的酱料是蒜蓉“); }
}
步骤3:客户端调用-炒菜了
public class Template Method{public static void main(String[] args){//炒 - 手撕包菜ConcreteClass_BaoCai BaoCai = new ConcreteClass_BaoCai();BaoCai.cookProcess();//炒 - 蒜蓉菜心ConcreteClass_ CaiXin = new ConcreteClass_CaiXin();CaiXin.cookProcess();}}
结果输出
倒油
热油
下锅的蔬菜是包菜
下锅的酱料是辣椒
炒啊炒啊炒到熟倒油
热油
下锅的蔬菜是菜心
下锅的酱料是蒜蓉
炒啊炒啊炒到熟
通过上述这个常见的生活例子,我相信你已经完全明白了模板方法模式的原理了!!
3. 优缺点
在全面解析完模板方法模式后,我来分析下其优缺点:
3.1 优点
- 提高代码复用性
将相同部分的代码放在抽象的父类中 - 提高了拓展性
将不同的代码放入不同的子类中,通过对子类的扩展增加新的行为 - 实现了反向控制
通过一个父类调用其子类的操作,通过对子类的扩展增加新的行为,实现了反向控制 & 符合“开闭原则”
3.2 缺点
引入了抽象类,每一个不同的实现都需要一个子类来实现,导致类的个数增加,从而增加了系统实现的复杂度。
4. 应用场景
- 一次性实现一个算法的不变的部分,并将可变的行为留给子类来实现;
- 各子类中公共的行为应被提取出来并集中到一个公共父类中以避免代码重复;
- 控制子类的扩展。
5. 总结
本文主要对模板方法模式进行了全面介绍。
欢迎关注Carson_Ho的CSDN博客 与 公众号!
博客链接:https://carsonho.blog.csdn.net/
请帮顶 / 评论点赞!因为你的鼓励是我写作的最大动力!
Carson带你学设计模式:模板方法模式(Template Method)相关推荐
- 趣谈设计模式 | 模板方法模式(Template Method):封装不变部分,扩展可变部分
文章目录 案例:房屋建造 模板方法模式 模板方法模式与策略模式 总结 完整代码与文档 这个设计模式过于简单,所以不是很好举例- 案例:房屋建造 假设我们是建筑公司中的规划者,负责设定建筑方案,在初期我 ...
- 模板方法模式 Template method 行为型 设计模式(二十六)
模板方法模式 Template method 上图为网上百度的一份简历模板截图 相信大家都有求职的经历,那么必然需要简历,写简历的时候,很可能你会网上检索一份简历模板,使用此模板的格式,然后替换为你的 ...
- JAVA设计模式(14) —行为型模板方法模式(Template Method)
1 定义: 模板方法模式(Template Method) Define the skeleton of an algorithm in anoperation, deferring some ste ...
- java 模板方法_设计模式(java实现)_模板方法模式(Template method)
设计模式(java实现)_模板方法模式(Template method) 模板方法模式是编程中经常用到到的模式.它定义了一个操作中的算法骨架,将某些步骤延迟到子类中实现.这样,新的子类可以在不改变一个 ...
- 设计模式之模板方法模式(Template Method Pattern)
模式的定义与特点 模板方法(Template Method)模式的定义如下:定义一个操作中的算法骨架,而将算法的一些步骤延迟到子类中,使得子类可以不改变该算法结构的情况下重定义该算法的某些特定步骤.它 ...
- C++设计模式——模板方法(Template Method)
模板方法(template method)设计模式用于定义一个包含许多步骤的算法框架,允许子类重写(覆盖)算法的某一个步骤而不改变算法整体的流程和框架. 模板方法提供的流程是骨架,子类无须覆盖模板方法 ...
- 设计模式之模板方法模式(Template Method)摘录
23种GOF设计模式一般分为三大类:创建型模式.结构型模式.行为模式. 创建型模式抽象了实例化过程,它们帮助一个系统独立于如何创建.组合和表示它的那些对象.一个类创建型模式使用继承改变被实例化的类,而 ...
- 设计模式之行为模式中的模板方法模式(template method)
设计模式之行为模式中的模板方法模式(template method) 声明 一.行为模式 二.模板方法模式 三.实例 概况描述 代码 运行结果 优点 类似的模式 优秀文章 声明 本人写此文章只是为了梳 ...
- javascript设计模式-模板方法模式(Template)
1 <!DOCTYPE HTML> 2 <html lang="en-US"> 3 <head> 4 <meta charset=&quo ...
最新文章
- withRouter组件
- for,while循环
- tcp/ip知识点的总结
- 实验二+140+阮晨曦
- 计算机用于数据管理经历了,管理系统中计算机应用--期中测验答案
- Google推出了Python最牛逼的编辑器,不看后悔一辈子!
- C/C++信息隐写术(一)之认识文件结构
- 用Dell光盘安装系统
- PHP正则匹配Html内容,并通过浏览器弹框下载Excel
- [Canvas]空战游戏进阶 增加发射子弹 敌机中弹爆炸功能
- 【jszip3.2.1 解压文件乱码】
- python中grid的用法_python pack()和grid()方法一起使用
- word文档中怎么输入公式符号
- android-Message.obtain和handler.obtainMessage
- pmp是什么意思啊?
- ubuntu20.04 常用开发工具整理
- 游戏模型与动漫之间,有多大差距?
- 想知道自己30分钟能“走”多远嘛?
- 油猴脚本——掘金Markdown格式适配器知识点记录【油猴脚本、Markdown、浏览器文件读取、tooltip、SVG、、模拟用户输入、aria-xxxx属性、剪切板操作、】
- 微信小程序实现上传图片功能