模板方法模式
时间:2022-07-28
本文章向大家介绍模板方法模式,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
模板方法模式
模板方法模式Template Method Pattern
定义了如何执行某些算法的框架,一个抽象类公开定义了执行它的方法的方式或模板,其子类可以按需要重写方法实现,也可以调用将以抽象类中定义的方式进行,这种类型的设计模式属于行为型模式。
描述
模板方法模式是一种行为设计模式,用于定义操作中算法的程序框架,从而将某些步骤推迟到子类中,其可以重新定义算法的某些步骤,而无需更改算法的结构。
优点
- 封装不变部分,扩展可变部分,提高了拓展性。
- 提取公共代码,便于维护,提高代码复用性。
- 行为由父类控制,子类实现,实现了反向控制 ,符合开闭原则。
缺点
- 每一个不同的实现都需要一个子类来实现,导致类的个数增加,使得系统更加庞大。
适用环境
- 有多个子类共有的方法,且逻辑相同。
- 重要的、复杂的方法,可以考虑作为模板方法。
实现
class Builder {
build() {
this.start();
this.lint();
this.assemble();
this.deploy();
}
}
class AndroidBuilder extends Builder {
constructor(){
super();
}
start() {
console.log("Ready to start build android");
}
lint() {
console.log("Linting the android code");
}
assemble() {
console.log("Assembling the android build");
}
deploy() {
console.log("Deploying android build to server");
}
}
class IosBuilder extends Builder {
constructor(){
super();
}
start() {
console.log("Ready to start build ios");
}
lint() {
console.log("Linting the ios code");
}
assemble() {
console.log("Assembling the ios build");
}
deploy() {
console.log("Deploying ios build to server");
}
}
(function(){
const androidBuilder = new AndroidBuilder();
androidBuilder.build();
// Ready to start build android
// Linting the android code
// Assembling the android build
// Deploying android build to server
const iosBuilder = new IosBuilder();
iosBuilder.build();
// Ready to start build ios
// Linting the ios code
// Assembling the ios build
// Deploying ios build to server
})();
每日一题
https://github.com/WindrunnerMax/EveryDay
参考
https://juejin.im/post/6844903615476269064
https://www.runoob.com/design-pattern/template-pattern.html
https://github.com/sohamkamani/javascript-design-patterns-for-humans#-template-method
- SpringMVC 启动流程及相关源码分析你要知道的SpringMVC启动流程和源码分析都在这里
- iOS runtime探究(四): 从runtiem开始实践Category添加属性与黑魔法method swizzling你要知道的runtime都在这里
- C# 复制PDF页面到另一个PDF文档
- Java8 Lambda表达式与Stream API (一):Lambda表达式你要知道的Java8 匿名内部类、函数式接口、lambda表达式与Stream API都在这里
- iOS runtime探究(五): 从runtime开始深入weak实现机理你要知道的runtime都在这里
- Java8 Lambda表达式与Stream API (二): Stream API的使用你要知道的Java8 匿名内部类、函数式接口、lambda表达式与Stream API都在这里
- Python Garbage Collection 与 Objective-C ARCPython GC 与 Objective-C ARC
- SpringMVC DispatcherServlet执行流程及源码分析你要知道的SpringMVC DispatcherServlet执行流程及源码分析都在这里
- iOS runtime探究(三): 从runtime开始理解OC的属性property你要知道的runtime都在这里
- jQuery选择器大全(48个代码片段+21幅图演示)1
- KVC 使用方法详解及底层实现你要知道的KVC、KVO、Delegate、Notification都在这里
- jQuery选择器大全(48个代码片段+21幅图演示)2
- 神经网络-感知器
- NSNotificationCenter 通知的使用方法详解你要知道的KVC、KVO、Delegate、Notification都在这里
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 闭包与高阶函数
- IDEA设置maven修改settings.xml配置文件无法加载仓库
- 在Linux下如何根据域名自签发OpenSSL证书与常用证书转换 修改openssl.cnf配置文件创建根证书自签发泛域名证书将crt转pem格式生成 p12 格式的
- CAS 原子操作
- FlutterDojo设计之道—状态管理之路(七)
- Kubernetes K8S之存储ConfigMap详解 通过目录创建通过文件创建通过命令行创建通过yaml文件创建当前存在的ConfigMap使用ConfigMap
- Material Components——Shape的处理
- pandas系列 - (一)明细数据汇总简单场景应用
- Spring系列 SpringMVC的请求与数据响应
- PHP代码审计03之实例化任意对象漏洞
- 最简单入门深度学习
- Redis 字典结构细谈
- 终于弄明白 i = i++和 i = ++i 了
- 更简易的机器学习-pycaret的安装和环境初始化
- 直观讲解一下 RPC 调用和 HTTP 调用的区别!