模板方法模式:
在一个方法中定义一个算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以在不改变算法结构的情况下,重新定义算法中的某些步骤。
模板方法的实现需要语言层面的支持:比如继承,多态。
关注点:
1、抽象类实现一个算法的不变的部分,并将可变的行为留给子类来实现;抽象类一般用来控制执行流程,是主逻辑;各子类中公共的行为应被提取出来并集中到一个公共父类中以避免代码重复。
2、具体类:具体类的定位是实现算法中的部分个性化的逻辑,即逻辑分解的子逻辑。
3、控制子类扩展。模板方法只在特定点调用“hook”操作,这样就只允许在这些点进行扩展。
模式中的角色:
抽象类(AbstractClass):实现了模板方法,定义了算法的骨架。
具体类(ConcreteClass):实现抽象类中的抽象方法,完成完整的算法。
注意点:
一般把模板方法定义成final避免被子类修改
JDK中的体现:
ThreadPoolExecutor.Worker
举例:
角色:抽象模板
package com.pichen.dp.behavioralpattern.templatemethod;
public abstract class Day {
public void getUp(){
System.out.println("get up~");
}
public abstract void breakfast();
public abstract void goToWork();
public abstract void working();
public abstract void lunch();
public abstract void goHome();
public abstract void supper();
public void sleep(){
System.out.println("sleep~");
}
//模板方法
public final void process(){
getUp();
breakfast();
goToWork();
working();
lunch();
working();
goHome();
supper();
sleep();
}
}
具体子类:
public class ProgrammerDay extends Day{
/**
* @see com.pichen.dp.behavioralpattern.templatemethod.Day#breakfast()
*/
@Override
public void breakfast() {
System.out.println("breakfast:noodle~");
}
/**
* @see com.pichen.dp.behavioralpattern.templatemethod.Day#goToWork()
*/
@Override
public void goToWork() {
System.out.println("goToWork:drive car~");
}
/**
* @see com.pichen.dp.behavioralpattern.templatemethod.Day#working()
*/
@Override
public void working() {
System.out.println("working: coding~");
}
/**
* @see com.pichen.dp.behavioralpattern.templatemethod.Day#lunch()
*/
@Override
public void lunch() {
System.out.println("lunch: eat rice~");
}
/**
* @see com.pichen.dp.behavioralpattern.templatemethod.Day#goHome()
*/
@Override
public void goHome() {
System.out.println("goHome: walk~");
}
/**
* @see com.pichen.dp.behavioralpattern.templatemethod.Day#supper()
*/
@Override
public void supper() {
System.out.println("supper: rice~");
}
}
客户端:
public class Main {
public static void main(String[] args) {
Day programmerDay = new ProgrammerDay();
programmerDay.process();
}
}
输出:
get up~
breakfast:noodle~
goToWork:drive car~
working: coding~
lunch: eat rice~
working: coding~
goHome: walk~
supper: rice~
sleep~
分享到:
相关推荐
Ace Admin , Responsive Admin Theme
模板方法模式(Template Method)是设计模式中行为型模式的一种,它定义了操作中的算法骨架,而将一些步骤延迟到子类中。使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。这个模式在C++编程中有着...
基于node.js、vue、mongodb等技术构建的web系统,界面美观,功能齐全,适合用作毕业设计、课程设计作业等,项目均经过测试,可快速部署运行! 基于node.js、vue、mongodb等技术构建的web系统,界面美观,功能齐全,...
Redis_Templete是一个关于在不使用Spring Data Redis的情况下操作Redis的示例项目。在这个项目中,我们将探讨如何直接通过Jedis或Lettuce等客户端库与Redis进行交互,以实现常见的数据存储和检索功能。虽然Spring ...
标题“portfolio-templete-using-bootstrap”表明这是一个使用Bootstrap框架创建的个人作品集模板。Bootstrap是目前最流行和广泛使用的前端开发框架,它提供了一系列预先设计的CSS和JavaScript组件,可以帮助开发者...
在【压缩包子文件的文件名称列表】"bussiness-templete-main"中,我们可以预期找到该模板的主要文件和资源,可能包括: - HTML文件:如index.html,代表模板的主页,包含了整个网站的结构和内容。 - CSS文件:如...
ZerioDev的音乐机器人 相当不错的音乐机器人 要求 节点版本14及更高版本 第一的 通过执行git clone ... (如果下载为zip,则需要将其解压缩) 然后 在终端做 npm i ...转到config / bot.js并填充它。...单击邀请我的机器人
令狐冲的算法小抄我曾经就职于硅谷顶级顶尖IT企业,收到的顶尖企业提供了10+,也是前算法竞赛国家集训队员,到现在为止,刷过的算法题已超过3000道。身边经常有人问我:你是怎么做到刷这么多题的?...
:graduation_cap: :woman::graduation_cap: 在“学生帮助学生”的口号下开发了一个学生反馈的社交平台,提供了这些学术资料,这些资料分为多个部分,每个部分旨在解决与学生有关的最常见的与信息有关的问题,即大...
北京交通大学博士毕业论文latex模版 ################################### 2021年1月3日最新更新,更新了奇偶页页眉页脚区别,更新了自动空白页, 更新了奇偶页页边距区别(根据学校要求,考虑到装订的时候,奇偶页...
3. **兼容性**:由于其轻量化设计,artTemplate能在各种浏览器环境中良好运行,包括较旧的IE版本。 4. **灵活性**:支持嵌套模板和自定义辅助函数,满足复杂场景的需求。 5. **社区支持**:artTemplate有一个活跃...
弹簧靴基础实战项目 支持作者就star一下,谢谢 :party_popper: :party_popper: :kiss_mark: spring boot项目实战基础脚手架,提供基础增,减,改,查模板,批量删除,局部刷新,多条件模糊查询,视图切换,设置...
运行(开发模式) npm run start || npm run dev 构建 npm run build env==production 打包在dist 目录下 自动化 最初是用travis做自动化。但其实后来的github action 感觉更好用些,而且对私有项目支持比较友好。 ...
10. **RESTful API设计**:如果这个项目包含一个供其他应用使用的API,了解RESTful设计原则能帮助构建清晰、可扩展的服务。 通过“sms-template-master”这个文件名,我们可以推断这可能是一个项目的主分支或主版本...
可重用的管理模板 使用React,Ant Design,MockJS(生成虚拟数据)进行开发您只需要提供一个端点API,并且此模板集成了开发admin时应用的所有必要功能。 从...开始 npm i npm start 封装管理网站的一些常用功能 ...
997 leetcode c Leetcode-问题 我对 Leetcode 问题的解决方案。 2019 年 ...问题的人只会在放弃并尽力而为之后寻找解决方案。...因此,解决方案需要详细,以便他们了解正在发生的事情。...牢记这一点,我将开始添加解决方案,...
这是一个使用Python和Selenium_WebDriver编写的网页爬虫项目。项目的主要功能是打_docker-spider-templete
NPM库创建React App模板 (CRA)模板以构建和发布具有rollup , eslint和stylelint配置的NPM库。 请参阅。用法npx create-react-app %PROJECT_NAME% --template npm-library 要么yarn create react-app %PROJECT_...
django-vuex 该项目仅将VueJS和Vuex用作静态Django文件。 并使用。 如何运行项目? npm run build生成仅与Django一起运行的文件。 克隆此存储库。... 使用Python 3创建virtualenv。...source .venv/bin/ac
模板是C++支持参数化多态的工具,使用模板可以使用户为类或者函数声明一种一般模式,使得类中的某些数据成员或者成员函数的参数、返回值取得任意类型。 模板是一种对类型进行参数化的工具; 通常有两种形式:...