李建忠设计模式-组件协作模式-模板方法模式
目录
1.前言
2.模板方法模式(Template Method)
1.动机
2.例子
3.定义
1.结构图
2.模板方法模式适用情形
3.模式特点
参考
1.前言
现代软件专业分工后的第一个结果是“框架与应用程序的划分”、“组件协作”模式通过晚期绑定,来实现框架与程序之间的松耦合,是二者之间协作时常用的模式。
典型模式:
- Template Method
- Strategy
- Observer/Event
2.模板方法模式(Template Method)
1.动机
- 软件构建过程中,它常常有稳定的整体结构,但各个子步骤却有很多改变的需求或者由于固定的原因而无法和任务的整体结构同时实现。
- 如何确定稳定操作结构的前提下,来灵活应对各个子步骤的变化或者晚期实现需求
2.例子
//早绑定
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;namespace Pattern
{//程序开发人员class Library{public void Step1(){//...}public void step3(){//...}public void step5(){//...}}//应用程序开发人员class Program{public bool Step2(){bool flag = false;return flag;}public void Step4(){//...}static void Main(string[] args){Library lib = new Library();Program app = new Program();lib.Step1();if (app.Step2()){lib.step3();}for (int i = 0; i < 4; i++){app.Step4();}lib.step5();}}
}
程序主流程在软件中相对稳定,具有复用性
//晚绑定
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;namespace Pattern
{//程序开发人员public class Library{//稳定 Template Methodpublic void Run(){Step1();if (Step2()){step3();//支持变化==》虚函数的多态调用}for (int i = 0; i < 4; i++){Step4();//支持变化==》虚函数的多态调用}step5();}protected void Step1(){//...}protected void step3(){//...}protected void step5(){//...}public virtual bool Step2(){//变化return false;}public virtual void Step4()//变化{}}//应用程序开发人员class Program : Library{public override bool Step2(){bool flag = false;return flag;}public override void Step4(){//...}static void Main(string[] args){Library lib = new Program();lib.Run();}}
}
3.定义
一个操作中的算法的骨架(稳定),而将一些步骤延迟(变化)到子类中。Tempalte Method使得子类可以不改变(复用)一个结构即可重定义(override重写)该算法的某些特定步骤。——GOF
1.结构图
模板方法模式参与者
(1)、抽象类角色(AbstractClass):定义一个模板方法(TemplateMethod),在该方法中包含着一个算法的骨架,具体的算法步骤是PrimitiveOperation1方法和PrimitiveOperation2方法,该抽象类的子类将重定义PrimitiveOperation1和PrimitiveOperation2操作。
(2)、具体类角色(ConcreteClass):实现PrimitiveOperation1方法和PrimitiveOperation2方法以完成算法中与特定子类(Client)相关的内容。
在模板方法模式中,AbstractClass中的TemplateMethod提供了一个标准模板,该模板包含PrimitiveOperation1和PrimitiveOperation2两个方法,这两个方法的内容Client可以根据自己的需要重写。
2.模板方法模式适用情形
(1)、 一次性实现一个算法的不变部分,并将可变的行为留给子类来实现。
(2)、 各子类中公共的行为应被提取出来并集中到一个公共父类中以避免代码重复。
(3)、 控制子类扩展。模板方法只允许在特定点进行扩展,而模板部分则是稳定的。
3.模式特点
- 该模式是一种非常基础性的设计模式,在面向对象系统中有着大量的应用。机制简洁(虚函数的多态性),为很多应用程序框架提供了灵活的扩展点,时代吗复用方面的基本实现结构 。
- “不要调用我,让我来调用你”的反向控制结构是Template Method的典型应用
- 被Template Method调用的虚方法可以实现,也可以没有实现(抽象方法、纯虚方法),但一般它们设置为protected方法。
参考
C#设计模式之十三模板方法模式(Template Method Pattern)
哔哩哔哩:李建忠设计模型
李建忠设计模式-组件协作模式-模板方法模式相关推荐
- 李建忠设计模式——策略模式Strategy
目录 1.策略模式定义 1.动机 2.模式定义 3.结构 2.实现例子 1.问题描述 2.代码实现 3.要点总结 4.参考 1.策略模式定义 1.动机 软件构建过程中,某些对象使用的算法可能多种多样, ...
- 李建忠设计模式——观察者模式
1.观察者模式(Observer/Event) 1.动机 在软件构建过程中,需要为某些对象建立一种"通知依赖关系"--一个对象(目标)的状态发生改变,所有的依赖对象(观察者对象)都 ...
- 清华李建忠设计模式课程感想
最近又看了一波设计模式的东西,又有一些新的认识,设计模式一般是重构到模式,模式不是一蹴而就的,很多最开始在实现产品经理的需求时,第一版是不太能识别模式的,当然如果后期的迭代需求方向明确也可做提前设计, ...
- 李建忠设计模式之“组件协作”模式
文章目录 模板方法模式(Template Method) 定义 动机 结构图 代码 要点 总结 策略模式(Strategy) 定义 动机 结构图 代码 要点 总结 观察者模式(Observer/Eve ...
- 李建忠设计模式之总结
总结 一个目标:管理变化,提高复用! 两个手段:分解 && 抽象 八大原则 依赖倒置原则(DIP) 开放封闭原则(OCP) 单一职责原则(SRP) Liskov 替换原则(LSP) 接 ...
- 李建忠设计模式(二)
目录 1.23种设计模式的分类 1.GOF-23模式分类 2.从封装变化校对对模式分类 3.重构关键技法 1.23种设计模式的分类 设计模式的最大作用:在变化和稳定中间寻找隔离点,然后来分离它们,从而 ...
- 李建忠设计模式之“单一职责”模式
文章目录 装饰器模式(Decorator) 定义 动机 结构图 代码 要点 总结 桥方法模式(Bridge) 定义 动机 结构图 代码 要点 总结 在软件组件的设计中,如果责任划分的不清晰,使用继承得 ...
- 李建忠设计模式之”数据结构“模式
文章目录 组合模式(Composite) 定义 动机 结构图 代码 要点 总结 迭代器模式(Iterator) 定义 动机 结构图 代码 要点 总结 责任链模式(China of Resposibil ...
- 李建忠设计模式之”行为变化“模式
文章目录 命令模式(Command) 定义 动机 结构图 代码 要点 总结 访问器模式(visitor) 定义 动机 结构图 代码 要点 总结 在组件的构建过程中,组件行为的变化经常导致组件本身剧烈的 ...
最新文章
- CVPR2020论文解读:3D Object Detection三维目标检测
- mysql sql 1到10_(1.10)SQL优化——mysql 常见SQL优化
- 视图、索引、存储过程优缺点
- 阿里规定代码中禁用static修饰SimpleDateFormat,为何?
- 离人愁有用计算机怎么写歌词,离人愁歌词是什么意思 今两股痒痒什么意思
- 《mount的艺术》-linux命令五分钟系列之十四
- AngularJS-webapp($q)
- 史上最经典的数据库面试题之一
- 聊聊激光雷达原理之i-TOF
- unity 使物体跟随路径点自动移动位置 插值旋转
- Pareto相关理论
- 解决console控制台反复打印“WebSocket connection to ws://localhost:9528/sockjs-node/107/uadaszgz.websocket fai
- iOS 开发的一些奇巧淫技
- 学校机房网上作业发放、提交系统案例
- Perl Regular Expression Syntax Perl的正则表达式语法
- 01 双重差分与三重差分分析法
- redis实现简单的动态密码
- Spring中Bean的生命周期以及三级缓存介绍
- 自然场景OCR检测(YOLOv3+CRNN)
- [转]Kindle 推送教程:教你用电子邮箱推送电子书
热门文章
- 为什么学校计算机没有声音,为什么打开计算机后没有声音
- 【第37天】斐波那契数列与爬楼梯 | 迭代的鼻祖,递推与记忆化
- 你是欢喜还是忧?锤子手机发布会观后感
- 从小米科技的创始人、董事长、首席执行官雷军的代码水平说起
- pygame网络游戏_5_5:网络编程_游戏客户端【终章!】
- 【夸夸其谈】游戏中的货币是个什么玩意儿
- 导入外部字体且带字体压缩,以及判断h5,app,微信小游戏环境和字体的具体实现方式(egret为例)
- java springboot大学生兼职平台的设计与实现
- Vala学习笔记(一) - HelloWorld!
- 如何使用数据工厂分析业务数据