模板方法设计模式

25 篇文章 0 订阅
订阅专栏

模板方法设计模式


1. 简单介绍

模板方法设计模式是一种结构型设计模式。该模式定义了一个算法的骨架(方法执行的步骤),将算法的各个步骤的具体实现,交由子类完成。模板方法设计模式,让开发者只需要关注算法实现各个细节,而不必关系算法实现的全部流程。

2. 使用场景
  • 具有统一的算法骨架,即方法执行步骤是固定不变的
  • 针对不同的场景,存在多个具有相同操作步骤的应用场景,但部分算法的实现细节有所差异
3. 场景举例

Spring中的事务管理的设计采用了模板方法设计模式。事务的使用步骤可以抽象为:开启事务、相关操作、提交事务。针对上述步骤中的“开启事务”和“提交事务”,可由模板方法进行固定。而具体的“相关操作”,针对不同的子类可以有不同的实现。

4. UML类图

模板方法模式UML类图

5. 具体实现

描述

  • 背景:活字印刷术,可以根据自己的需求,组合不同的汉字,将组合后的汉字按顺序印刷出自己想要的词组或句子,现假设现有一块印刷版支持三个字的组合,任意组合
  • AbstractPrintBoardAbstractClass角色,表示印刷版,用于用户自由组合三个汉字进行印刷
  • PrintBoardOneConcreteClass角色,可对“你”、“真”、“好”三个汉字进行组合印刷
  • PrintBoardTwoConcreteClass角色,可对“你”、“真”、“坏”三个汉字进行组合印刷

实现代码

AbstractPrintBoard.java

/**
 * 角色:AbstractClass
 * 印刷版,用于用户自由组合三个汉字进行印刷
 */  
public abstract class AbstractPrintBoard {

    /**
     * 模版方法:控制汉字印刷顺序
     * 先印刷 chineseCharacter1、再印刷 chineseCharacter2,最后印刷 chineseCharacter3
     */
    public void print() {
     System.out.println(String.format("%c%c%c", chineseCharacter1(), chineseCharacter2(), chineseCharacter3()));
    }

    /**
     * 交由具体子类进行实现(具体哪几个汉字进行组合)
     */
    public abstract char chineseCharacter1();

    public abstract char chineseCharacter2();

    public abstract char chineseCharacter3();

}

PrintBoardOne.java

/**
    * 角色:具体实现子类
    * 组合“你”、“真”、“好”三个汉字进行印刷
    */
   public class PrintBoardOne extends AbstractPrintBoard {
   
           @Override
           public char chineseCharacter1() {
               return '你';
           }

           @Override
           public char chineseCharacter2() {
               return '真';
           }

           @Override
           public char chineseCharacter3() {
               return '好';
           }
    }

PrintBoardTwo.java

/**
 * 角色:具体实现子类
 * 组合“你”、“真”、“坏”三个汉字进行印刷
 */
public class PrintBoardTwo extends AbstractPrintBoard {

    @Override
    public char chineseCharacter1() {
        return '你';
    }

    @Override
    public char chineseCharacter2() {
        return '真';
    }

    @Override
    public char chineseCharacter3() {
        return '坏';
    }
}

Client.java

/**
 * 模版方法模式具体使用
 */
public class Client {

    public static void main(String[] args) {
        // AbstractPrintBoard控制了印刷汉字的顺序,具体印刷哪几个汉字,加油子类进行实现
        // 印刷“你真好”三个汉字,输出:你真好
        AbstractPrintBoard board1 = new PrintBoardOne();
        board1.print();

        // 印刷“你真坏”三个汉字,输出:你真坏
        AbstractPrintBoard board2 = new PrintBoardTwo();
        board2.print();
    }
}
7. 源码展示

Spring源码中的ApplicationContex的部分功能的实现实现采用了模板方法设计模式。其中模板方法模式中抽象类角色对应AbstractApplicationContext,该类中定义了refresh()方法的流程步骤,即模板方法。具体子类角色对应的类为GenericApplicationContext,并实现了抽象方法refreshBeanFactory()

AbstractApplicationContext.java

/**
 * 角色:模板方法中的抽象类
 */
public abstract class AbstractApplicationContext extends DefaultResourceLoader
		implements ConfigurableApplicationContext {
    
    /**
     * refresh()相当于模版方法模式中的模板方法,确保了刷新的具体步骤
     * 部分具体的刷新步骤交给其子类进行具体的实现
     */
    @Override
	public void refresh() throws BeansException, IllegalStateException {
		synchronized (this.startupShutdownMonitor) {
			// obtainFreshBeanFactory()方法调用了抽象方法refreshBeanFactory();
			ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory();

			// Prepare the bean factory for use in this context.
			prepareBeanFactory(beanFactory);

			try {
                // 抽象方法,交由子类实现
				postProcessBeanFactory(beanFactory);
			} catch (BeansException ex) {
                ......
			} finally {
				......
			}
		}
	} 
    
    protected ConfigurableListableBeanFactory obtainFreshBeanFactory() {
		// 抽象方法,交由子类实现
        refreshBeanFactory();
		ConfigurableListableBeanFactory beanFactory = getBeanFactory();
		if (logger.isDebugEnabled()) {
			logger.debug("Bean factory for " + getDisplayName() + ": " + beanFactory);
		}
		return beanFactory;
	} 
    
    /**
     * 抽象方法,交由子类实现
     */
    protected abstract void refreshBeanFactory() throws BeansException, IllegalStateException;
    
    /**
     * 默认是空实现的抽象方法,也称为钩子方法
     * 子类可按需求,选择是否进行重写
     */
    protected void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) {
	}
}

GenericApplicationContext.java

/**
 * 角色:模板方法中的具体子类
 */
public class GenericApplicationContext extends AbstractApplicationContext implements BeanDefinitionRegistry { 
    
    /**
     * 抽象方法的具体实现
     */
    @Override
	protected final void refreshBeanFactory() throws IllegalStateException {
		if (!this.refreshed.compareAndSet(false, true)) {
			throw new IllegalStateException(
					"GenericApplicationContext does not support multiple refresh attempts: just call 'refresh' once");
		}
		this.beanFactory.setSerializationId(getId());
	}
    
}
模板方法设计模式(详解加案例)
Vicali的博客
11-11 1524
模板方法设计模式 抽象类体现的就是一种模板模式的设计,抽象类作为多个子类的通用模板,子类在抽象类的基础上进行扩展、改造,但子类总体上会保留抽象类的行为方式。 解决的问题: 当功能内部一部分实现是确定的,一部分实现是不确定的。这时可以把不确定的部分暴露出去,让子类去实现。 换句话说,在软件开发实现一个算法时,整体步骤是固定、通用的,这些步骤已经在父类写好了。但是某些部分易变,易变部分可以抽象出来,供不同子类实现。这就是一种模板模式。 例如:办理银行业务 步骤是固定的 — 模板 — 抽象类 1) 取号 —
设计模式 - 模版方法
热门推荐
勿在浮沙筑高台
02-08 2万+
设计模式 - 模版方法 场景 小张的团队最近接受一个需求,实现实现一家咖啡店的冲泡咖啡和茶的冲泡自动化。之前这家咖啡店都是由咖啡师傅手动进行调制咖啡和茶。现在咖啡店需要引入自动化的点单和调制饮料的系统,小张负责实现调制饮料的功能。 咖啡师傅手工冲泡咖啡和茶的流程: 冲泡咖啡: 把水煮沸 用沸水冲泡咖啡 把咖啡倒入杯子 加糖和牛奶 冲泡茶: 把水煮沸 用沸水冲泡茶叶 把茶倒入...
深入理解模板方法模式的设计原理
最新发布
ma_nong33的博客
07-26 1500
经典设计模式大概有23种。设计模式是指在软件开发,经过验证的,用于解决在特定环境下,重复出现的,特定问题的解决方案。从定义可以看出,设计模式的使用有很多的局限性。一定要明确它解决什么问题,再使用它。当不清楚设计模式解决什么问题时不要轻易使用。通俗的讲,设计模式是解决软件开发过程一些问题的固定套路。不要过度的封装或使用设计模式,除非明确了需求的具体变化方向,而且变化方向的点是反复的出现,才会使用设计模式;即慎用设计模式设计模式要到达一定的工程代码量才能精通。但是,了解设计模式是需要的。
模板方法设计模式1
08-08
模板方法设计模式是一种在面向对象设计非常常用的设计模式,它的主要目的是为了封装算法或操作流程的固定部分,同时允许子类对其某些特定步骤进行定制。这种模式遵循开闭原则,即对扩展开放,对修改关闭,允许...
第05章 面向对象(下) 10 抽象类应用之模板方法设计模式
09-13
面向对象编程是软件开发的核心思想之一,而模板方法设计模式是这种思想在实践的一种具体应用。本章我们将深入探讨“模板方法设计模式”,并结合Java语言进行详细讲解。 模板方法设计模式是一种行为设计模式,它...
Java模板方法设计模式[定义].pdf
10-19
Java 模板方法设计模式定义 Java 模板方法设计模式是指在软件开发过程,通过定义一个通用的算法结构,然后将具体的实现细节交给子类来完成的设计模式。该模式的核心思想是,通过回调函数来实现算法的可扩展性和...
js如何实现设计模式模板方法
10-27
模板方法设计模式是一种行为设计模式,它允许我们在父类定义一个算法的骨架,而将一些步骤延迟到子类。这种模式使得子类可以在不改变算法结构的情况下,重写特定的步骤。 在JavaScript实现模板方法,主要利用...
设计模式~~~模板方法模式
PeakGao
10-13 1万+
学习难度:※※ 使用频率:※※※ 在面向对象程序设计过程,程序员常常会遇到这种情况:设计一个系统时知道了算法所需的关键步骤,而且确定了这些步骤的执行顺序,但某些步骤的具体实现还未知,或者说某些步骤的实现与具体的环境相关。 例如,去银行办理业务一般要经过以下4个流程:取号、排队、办理具体业务、对银行工作人员进行评分等,其取号、排队和对银行工作人员进行评分的业务对每个客户是一样的,可以在父类实现,但是办理具体业务却因人而异,它可能是存款、取款或者转账等,可以延迟到子类实现。 这样的例子在生活
利用JS特性实现模板方法设计模式
在JavaScript实现设计模式模板方法,利用语言特性来确保核心流程的可复用性和灵活性。模板方法模式是一种行为设计模式,它允许我们在不改变算法结构的情况下,以抽象的方式定义算法的骨架,而将具体的步骤留给...
写文章

热门文章

  • Java 14 新特性 3030
  • Idea构建、编译Spring源码 1102
  • Idea设置类和方法注释模板 1073
  • 桥接设计模式 771
  • 访问者设计模式 769

分类专栏

  • Java基础 1篇
  • 设计模式 25篇
  • 金典系列 1篇
  • 开发工具 2篇
  • LeetCode 27篇

最新评论

  • Java 14 新特性

    网忆小叶 回复 bugpool: 感谢感谢

  • Java 14 新特性

    bugpool: 很有学习价值,感谢.

大家在看

  • 道路车辆功能安全 ISO 26262标准(6-3)—软件级产品开发 730
  • 神经系统疾病研究的新兴工具:脑类器官
  • 热门短剧搜索网站+内置1.2万条短视频数据+无授权开心版
  • 【数据结构与算法】串,数组和队列 636
  • 人工智能领域常见简称的含义 483

最新文章

  • 27. 移除元素
  • 金典系列之红黑树
  • 26. 删除排序数组中的重复项
2020年27篇
2019年29篇

目录

目录

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值

深圳坪山网站建设公司铜仁市网站优化公司玩具网站优化价格表怎么查询网站是哪家优化的淘宝网站的优化策略如何优化公司网站新闻河北网站建设优化制作公司深圳网站排名优化网站优化的必要性怎么做老城区网站优化报价百色网站优化青海网站关键字优化南沙专业网站优化seo网站优化服务宜兴网站推广优化哪家公司靠谱网站优化的价格网站优化黑帽衢州常山县热销百度网站优化新网站的优化家具网站seo优化费用北海网站优化报价沙河网站优化外包公司文昌湖南网站优化推广长安搜索网站优化价格丰台网站优化推广公司茂名网站优化哪家好湘西网站综合优化网站排名优化软件推广方法章丘网站优化网站关键词优化推广软件优化网站+site香港通过《维护国家安全条例》两大学生合买彩票中奖一人不认账让美丽中国“从细节出发”19岁小伙救下5人后溺亡 多方发声卫健委通报少年有偿捐血浆16次猝死汪小菲曝离婚始末何赛飞追着代拍打雅江山火三名扑火人员牺牲系谣言男子被猫抓伤后确诊“猫抓病”周杰伦一审败诉网易中国拥有亿元资产的家庭达13.3万户315晚会后胖东来又人满为患了高校汽车撞人致3死16伤 司机系学生张家界的山上“长”满了韩国人?张立群任西安交通大学校长手机成瘾是影响睡眠质量重要因素网友洛杉矶偶遇贾玲“重生之我在北大当嫡校长”单亲妈妈陷入热恋 14岁儿子报警倪萍分享减重40斤方法杨倩无缘巴黎奥运考生莫言也上北大硕士复试名单了许家印被限制高消费奥巴马现身唐宁街 黑色着装引猜测专访95后高颜值猪保姆男孩8年未见母亲被告知被遗忘七年后宇文玥被薅头发捞上岸郑州一火锅店爆改成麻辣烫店西双版纳热带植物园回应蜉蝣大爆发沉迷短剧的人就像掉进了杀猪盘当地回应沈阳致3死车祸车主疑毒驾开除党籍5年后 原水城县长再被查凯特王妃现身!外出购物视频曝光初中生遭15人围殴自卫刺伤3人判无罪事业单位女子向同事水杯投不明物质男子被流浪猫绊倒 投喂者赔24万外国人感慨凌晨的中国很安全路边卖淀粉肠阿姨主动出示声明书胖东来员工每周单休无小长假王树国卸任西安交大校长 师生送别小米汽车超级工厂正式揭幕黑马情侣提车了妈妈回应孩子在校撞护栏坠楼校方回应护栏损坏小学生课间坠楼房客欠租失踪 房东直发愁专家建议不必谈骨泥色变老人退休金被冒领16年 金额超20万西藏招商引资投资者子女可当地高考特朗普无法缴纳4.54亿美元罚金浙江一高校内汽车冲撞行人 多人受伤

深圳坪山网站建设公司 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化