13.java设计模式之模板模式
基本需求:
- 制作豆浆的流程 选材--->添加配料--->浸泡--->放到豆浆机打碎
- 通过添加不同的配料,可以制作出不同口味的豆浆
- 选材、浸泡和放到豆浆机打碎这几个步骤对于制作每种口味的豆浆都是一样的
- 通过模板方法可以完成
基本介绍:
- 模板方法模式(Template Method),又叫模板模式(Template),在一个抽象类公开定义了执行它的方法的模板。它的子类可以按需要重写方法实现,但调用将以抽象类中定义的方式进行 
- 模板方法模式 定义一个操作中的算法的骨架,而将一些步骤延迟到子类中,使得子类可以不改变一个算法的结构,就可以重定义该算法的某些特定步骤,这种类型的设计模式属于行为型模式 
- UML类图(原理)  
- 说明 - AbstractClass:抽象类,其中的template()为模板方法 - public final void template() {
 // 在模板方法内部调用其他方法 规定算法的具体流程,这些方法可以是抽象的,也可以不是抽象的
 // 抽象的方法就交由子类实现,子类不改变算法的结构重定义算法的某些步骤
 // 模板方法内部调用自身实现的方法,可作为钩子方法,让子类有选择的去实现
 operation1();
 operation2();
 }
 
 
- ConcreationClass:实现类,对template()方法内部所使用的方法进行实现,对钩子方法可以选择性的实现,不实现则使用父类的实现 
 
 
- UML类图(案例) 
- 代码实现 - public abstract class SoyMilk { // 模板方法 使用final 不能让子类重写,定义好具体的算法流程,其实现子类去实现
 public final void make() {
 select();
 if (isAdd()) {
 // 使用钩子方法判断是否需要加配料 默认加
 add();
 }
 soak();
 beat();
 } // 添加配料方法 ,不同品种的豆浆,加的配料不一样
 public abstract void add(); // 该方法为钩子方法,子类可根据情况是否实现该方法
 public boolean isAdd() {
 return true;
 } public void select() {
 System.out.println("选择好的新鲜黄豆");
 } public void soak() {
 System.out.println("黄豆和配料开始浸泡,需要3小时");
 } public void beat() {
 System.out.println("黄豆和配料放到豆浆机去打碎");
 } } // 子类一
 class RedBeanSoyMilk extends SoyMilk {
 // 重写添加方法
 @Override
 public void add() {
 System.out.println("添加上好的红豆");
 } } // 子类二
 class PeanutSoyMilk extends SoyMilk {
 // 重写添加方法
 @Override
 public void add() {
 System.out.println("添加上好的花生");
 } } // 子类三
 class PureSoyMilk extends SoyMilk {
 // 重写添加方法 和 钩子方法
 @Override
 public void add() {
 System.out.println("添加上好的花生");
 } @Override
 public boolean isAdd() {
 return false;
 }
 }
 
- public class Client {
 public static void main(String[] args) {
 // 制作红豆豆浆 调用模板方法
 SoyMilk redBeanSoyMilk = new RedBeanSoyMilk();
 redBeanSoyMilk.make();
 // 制作花生豆浆 调用模板方法
 SoyMilk peanutSoyMilk = new PeanutSoyMilk();
 peanutSoyMilk.make();
 // 制作纯豆浆 重写了钩子方法 调用模板方法
 SoyMilk pureSoyMilk = new PureSoyMilk();
 pureSoyMilk.make();
 }
 }
 
 
spring源码:
- 在spring的IOC容器中就使用到了模板模式
- UML类图
 
- 说明
- refresh()方法调用该类很多方法,也就是模板方法
- obtainFreshBeanFactory()方法内部调用了refreshBeanFactory()和getBeanFactory()方法,这两个方法是抽象方法,交由了子类去完成
- postProcessBeanFactory()和onRefresh()方法为钩子方法,在AbstractApplicationContext()内部进行了空实现,子类可以有选择的进行重写
 
 
注意事项:
- 基本思想是:算法只存在于一个地方,也就是在父类中,容易修改。需要修改算法时,只要修改父类的模板方法或者已经实现的某些步骤,子类就会继承这些修改
- 实现了最大化代码复用。父类的模板方法和已实现的某些步骤会被子类继承而直接使用
- 既统一了算法,也提供了很大的灵活性。父类的模板方法确保了算法的结构保持不变,同时由子类提供部分步骤的实现
- 该模式的不足之处:每一个不同的实现都需要一个子类实现,导致类的个数增加,使得系统更加庞大
- 一般模板方法都加上 final 关键字, 防止子类重写模板方法
- 模板方法模式使用场景:当要完成在某个过程,该过程要执行一系列步骤 ,这一系列的步骤基本相同,但其个别步骤在实现时可能不同,通常考虑用模板方法模式来处理
13.java设计模式之模板模式的更多相关文章
- 图解Java设计模式之模板模式
		图解Java设计模式之模板模式 豆浆制作问题 模板方法模式基本介绍 模板方法模式原理类图 模板方法模式解决豆浆制作问题 模板方法模式的钩子方法 模板方法模式在Spring框架中的源码分析 模板方法模式 ... 
- JAVA设计模式之模板模式
		在阎宏博士的<JAVA与模式>一书中开头是这样描述模板方法(Template Method)模式的: 模板方法模式是类的行为模式.准备一个抽象类,将部分逻辑以具体方法以及具体构造函数的形式 ... 
- Java设计模式之模板模式(Template )
		前言: 最近学习了Glide开源图片缓存框架,在学习到通过使用ModelLoader自定义数据源的时候,Glide巧妙的使用了Java的模板模式来对外暴露处理不同的Url数据源,今天来学习总结一下模板 ... 
- Java设计模式之模板模式及使用场景
		模板模式,顾名思义,就是通过模板拓印的方式. 定义模板,就是定义框架.结构.原型.定义一个我们共同遵守的约定. 定义了模板,我们的剩余工作就是对其进行充实.丰润,完善它的不足之处. 定义模板采用抽象类 ... 
- java设计模式之模板模式以及钩子方法使用
		1.使用背景 模板方法模式是通过把不变行为搬到超类,去除子类里面的重复代码提现它的优势,它提供了一个很好的代码复用平台.当不可变和可变的方法在子类中混合在一起的时候, 不变的方法就会在子类中多次出现, ... 
- 折腾Java设计模式之模板方法模式
		博客原文地址:折腾Java设计模式之模板方法模式 模板方法模式 Define the skeleton of an algorithm in an operation, deferring some ... 
- Java设计模式——装饰者模式
		JAVA 设计模式 装饰者模式 用途 装饰者模式 (Decorator) 动态地给一个对象添加一些额外的职责.就增加功能来说,Decorator 模式相比生成子类更为灵活. 装饰者模式是一种结构式模式 ... 
- 浅析JAVA设计模式之工厂模式(一)
		1 工厂模式简单介绍 工厂模式的定义:简单地说,用来实例化对象,取代new操作. 工厂模式专门负责将大量有共同接口的类实例化.工作模式能够动态决定将哪一个类实例化.不用先知道每次要实例化哪一个类. 工 ... 
- JAVA设计模式--装饰器模式
		装饰器模式 装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其结构.这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装. 这种模式创建了一个装饰 ... 
随机推荐
- 在centos下启动nginx出现Failed to start nginx.service:unit not found
			错误的原因就是没有添加nginx服务,所以启动失败. 解决方法: 1. 在/root/etc/init.d/目录下新建文件,文件名为nginx 或者用命令在根目录下执行:# vim /etc/i ... 
- redis过期事件,swoole监听
			$serv = new Swoole\Server('0.0.0.0', 9501, SWOOLE_BASE, SWOOLE_SOCK_TCP); $serv->set(array( 'work ... 
- The path "" is not a valid path to the 3.10.0-957.el7.x86_64 kernel headers.
			安装 kernel-devel yum install kernel-devel-$(uname -r) 
- eclipse时一直卡在进程中
			(1)今天遇到进入eclipse时一直卡在 进程中,无论是重启电脑,还是重启软件 删除 D:\workspace\.metadata\.lock 文件才有用,特此记录下. (2)还有一种情况就是打开e ... 
- Albert学习记录
			albert相对BERT而言主要有三个改进方向: 1.对Embedding因式分解 在BERT中,词向量维度E和隐层维度H是相等的.而词嵌入学习的是单词与上下文无关的表示,而隐层则是学习与上下文相关的 ... 
- ABP 数据访问 - IRepository 仓储
			ABP系列,这个系列来的比较晚,很多大佬其实已经分析过,为什么现在我又来一轮呢? 1.想自己来完整的学习一轮ABP 2.公司目前正在使用ABP,准备迁移Core 基于以上的目的,开始这个系列 ABP ... 
- 【DeepLearning】GoogLeNet
			InceptionV1 论文原文:Going deeper with convolutions 中英文对照 InceptionBN 论文原文:Batch Normalization: Accel ... 
- 05 . Go+Vue开发一个线上外卖应用(Session集成及修改用户头像到Fastdfs)
			用户头像上传 功能介绍 在用户中心中,允许用户更换自己的头像.因此,我们开发上传一张图片到服务器,并保存成为用户的头像. 接口解析 在用户模块的控制器MemberController中,解析头像上传的 ... 
- 写时复制集合 —— CopyOnWriteArrayList
			前言 JUC 下面还有一个系列的类,都是 CopyOnWriteXXX ,意思是写时复制,这个究竟是怎么回事?那就以 CopyOnWriteArrayList 为切入点,一起了解写时复制是怎么回事? ... 
- Centos7安 装python3+Selenium+chrome+chromedriver
			Centos7安装python3+Selenium+chrome+chromedriver详细python2和python3共存,Selenium错误的处理更新Centos源 wget -O /etc ... 
 
			
		