模板⽅法设计模式

  • 抽象模板(Abstract Template): 定义⼀个模板⽅法,这个模板⽅法⼀般是⼀个具体⽅法,给出⼀个顶级算法⻣架,
  • ⽽逻辑⻣架的组成步骤在相应的抽象操作中,推迟到⼦类实现
  • 模板⽅法:定义了算法的⻣架,按某种顺序调⽤其包含的基本⽅法
  • 基本⽅法:是整个算法中的⼀个步骤,包括抽象⽅法和具体⽅法
  • 抽象⽅法:在抽象类中申明,由具体⼦类实现。
  • 具体⽅法:在抽象类中已经实现,在具体⼦类中 可以继承或重写它

代码实现 每天早上日常

/*** 模板⽅法设计模式* 抽象模板(Abstract Template): 定义⼀个模板⽅法,这个模板⽅法⼀般是⼀个具体⽅法,给出⼀个顶级算法⻣架,* ⽽逻辑⻣架的组成步骤在相应的抽象操作中,推迟到⼦类实现* 模板⽅法:定义了算法的⻣架,按某种顺序调⽤其包含的基本⽅法* 基本⽅法:是整个算法中的⼀个步骤,包括抽象⽅法和具体⽅法*  抽象⽅法:在抽象类中申明,由具体⼦类实现。*  具体⽅法:在抽象类中已经实现,在具体⼦类中 可以继承或重写它* @author zhou*/
public abstract class AbstractTemplate {/*** 模版⽅法 : 每日日常*/public void dailyRoutineTemplateMethod(){getUp();wash();changeClothesAbstractMethod();haveMealAbstractMethod();commuteAbstractMethod();}/*** 具体⽅法:默认实现的方法*/public void getUp() {System.out.println("6点起床");}/*** 具体⽅法*/public void wash() {System.out.println("洗漱");}/*** 抽象⽅法 换衣服 */public abstract void changeClothesAbstractMethod();/*** 抽象⽅法 吃饭*/public abstract void haveMealAbstractMethod();/*** 抽象⽅法 通勤*/public abstract void commuteAbstractMethod();}
/*** 周一* @author zhou*/
public class Monday extends AbstractTemplate{@Overridepublic void changeClothesAbstractMethod() {System.out.println("今天很热啊 穿短袖吧");}@Overridepublic void haveMealAbstractMethod() {System.out.println("早饭吃麦当劳");}@Overridepublic void commuteAbstractMethod() {System.out.println("坐地铁去上班");}
}
/*** 周末* @author zhou*/
public class Weekend extends AbstractTemplate{@Overridepublic void getUp() {System.out.println("今天12点起床");}@Overridepublic void changeClothesAbstractMethod() {System.out.println("不换了");}@Overridepublic void haveMealAbstractMethod() {System.out.println("叫外卖");}@Overridepublic void commuteAbstractMethod() {System.out.println("下午继续睡,不同勤了");}
}
public class Test {public static void main(String[] args) {// 周一Monday monday = new Monday();monday.dailyRoutineTemplateMethod();System.out.println("==============================");// 周末Weekend weekend = new Weekend();weekend.dailyRoutineTemplateMethod();}}

如何在spring中使用

/*** 业务层* 数据层同理* @author zhou*/
public interface MyService {void test();
}
import org.springframework.stereotype.Service;/*** @author zhou*/
@Service
public class MyServiceImpl implements MyService {@Overridepublic void test() {System.out.println("业务");}
}

子类

/*** 周一* @author zhou*/
@Component
public class Monday extends AbstractTemplate{@Overridepublic void changeClothesAbstractMethod() {System.out.println("今天很热啊 穿短袖吧");}@Overridepublic void haveMealAbstractMethod() {System.out.println("早饭吃麦当劳");}@Overridepublic void commuteAbstractMethod() {System.out.println("坐地铁去上班");}
}

父类使用构造方法和ApplicationContext 来注入Bean

import org.springframework.beans.BeansException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.stereotype.Component;@Component
public class SpringContextHolder implements ApplicationContextAware {private static ApplicationContext applicationContext;@Autowired@Overridepublic void setApplicationContext(ApplicationContext applicationContext) throws BeansException {SpringContextHolder.applicationContext = applicationContext;}public static ApplicationContext getApplicationContext() {return applicationContext;}public static Object getBean(String name) {return getApplicationContext().getBean(name);}/*** 通过class获取Bean.** @param clazz* @param <T>* @return*/public static <T> T getBean(Class<T> clazz) {return getApplicationContext().getBean(clazz);}/*** 通过name,以及Clazz返回指定的Bean** @param name* @param clazz* @param <T>* @return*/public static <T> T getBean(String name, Class<T> clazz) {return getApplicationContext().getBean(name, clazz);}}
/*** 模板⽅法设计模式* 抽象模板(Abstract Template): 定义⼀个模板⽅法,这个模板⽅法⼀般是⼀个具体⽅法,给出⼀个顶级算法⻣架,* ⽽逻辑⻣架的组成步骤在相应的抽象操作中,推迟到⼦类实现* 模板⽅法:定义了算法的⻣架,按某种顺序调⽤其包含的基本⽅法* 基本⽅法:是整个算法中的⼀个步骤,包括抽象⽅法和具体⽅法*  抽象⽅法:在抽象类中申明,由具体⼦类实现。*  具体⽅法:在抽象类中已经实现,在具体⼦类中 可以继承或重写它* @author zhou*/
public abstract class AbstractTemplate {private MyService myService;public AbstractTemplate () {this.myService= SpringContextHolder.getBean(MyService.class);}/*** 模版⽅法 : 每日日常*/public void dailyRoutineTemplateMethod(){myService.test();getUp();wash();changeClothesAbstractMethod();haveMealAbstractMethod();commuteAbstractMethod();}/*** 具体⽅法*/public void getUp() {System.out.println("6点起床");}/*** 具体⽅法*/public void wash() {System.out.println("洗漱");}/*** 抽象⽅法 换衣服*/public abstract void changeClothesAbstractMethod();/*** 抽象⽅法 吃饭*/public abstract void haveMealAbstractMethod();/*** 抽象⽅法 通勤*/public abstract void commuteAbstractMethod();}
import com.zm.demo4.Monday;
import com.zm.demo4.Weekend;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;@SpringBootTest
class Demo01ApplicationTests {// 这里可以结合实际场景将策略和工厂模式应用@AutowiredMonday monday;@AutowiredWeekend weekend;@Testvoid contextLoads() {monday.dailyRoutineTemplateMethod();weekend.dailyRoutineTemplateMethod();}}

使用模板方法实现一个省 市 区 乡镇 不同级别的统计

待续~

springboot中使用模板⽅法设计模式-设计模块(六)相关推荐

  1. 六十四、SpringBoot中的模板引擎Thymeleaf

    @Author:Runsen 来源:尚硅谷 下面建议读者学习尚硅谷的B站的SpringBoot视频,我是学雷丰阳视频入门的. 具体链接如下:B站尚硅谷SpringBoot教程 文章目录 使用Sprin ...

  2. 模块递归拆分法: 设计模式 设计原则,复杂层次设计举例。系统重构 装饰模式,门面模式,代理模式

    程序员最牛逼的能力是模块拆分能力, 然后才能利用模块依赖的工具,java 9 或者 runtime期的osgi ,其他maven插件,maven build期. 其他idea插件,类似阿里云的代码规范 ...

  3. python中的引用法总结_python模块调用总结

    1.模块的定义 本质上就是.py结尾的python文件,用来从逻辑上组织python代码(变量,函数,类,逻辑),为了实现一个功能. 2.模块的调用方法 首先编写一个模块文件: 1 name='Tao ...

  4. JavaWeb学习之路——SpringBoot 中thymeleaf模板用法(三)

    thymeleaf模板用法 thymeleaf通过它特定的语法,对HTML的标记做渲染,能够访问后台的动态数据,实现静态html界面的动态化 1.添加架包 <!--引入动态模板-->< ...

  5. thymeleaf html模块化,SpringBoot中使用Thymeleaf模板开发的后台管理框架

    系统简介 JavaWeb专业版,企业级开发框架SpringBoot+Layui+Thymeleaf+MybatisPlus开发权限(RBAC)及内容管理框架,框架中集成了权限管理.模块管理,数据库管理 ...

  6. java中使用模板设计模式

    定义:实现一个算法时,整体步骤很固定.通用,这些步骤已经在父类中写好了 也就是我们干某些东西的时候,都会有固定的步骤,如springboot集成mybatis等和rentranlock中,都是使用了模 ...

  7. 领域驱动设计模式设计与实践_在域驱动设计中使用状态模式

    领域驱动设计模式设计与实践 域驱动设计(DDD)是一种开发软件的方法,其中,通过将实现与核心业务概念的不断发展的模型相联系,解决了问题的复杂性. 该术语是由Eric Evans创造的,并且有一个DDD ...

  8. ElementUI中显示是否以及SpringBoot中怎样存储实体类属性和数据库怎样设计字段

    场景 Vue+ElementUI+SpringBoot+Mysql 需要设计一些属性为是否,即只有两个选择的属性字段. 注: 博客: https://blog.csdn.net/badao_liuma ...

  9. SpringBoot中整合Mail实现发送模板邮件

    场景 项目搭建专栏: https://blog.csdn.net/BADAO_LIUMANG_QIZHI/column/info/35688 实现最简单的带标题以及文本内容的邮件发送: https:/ ...

最新文章

  1. 体绘制(Volume Rendering)概述介绍
  2. linux网卡固件名,修改CentOS7网卡名称为传统名称eth0格式
  3. 在python中、实例变量在类的内部通过_[宜配屋]听图阁
  4. 1月16日学习内容整理:存储库MongoDB之文档的增删改查操作补充
  5. 如何高效地远程部署?Fabric 来支招!
  6. 一加3支持android9吗,不忘老用户!一加3更新Android 9,网友:真的不将就
  7. 获取阿里云播放器当前播放速率
  8. Android 用代码Ping网络
  9. 274-MySQL(查看源码的工具sourceinsight)
  10. arduino与74HC595驱动8位数码管(含代码)
  11. 《可复制的领导力》学习总结
  12. 才在enom注册了10多个域名,就有人想盗我邮箱
  13. vue项目之UI插件:Element-UI的基本使用
  14. 【高级数据结构】线段树 | 求区间和
  15. 十、如何给标识符命名
  16. c#调用bartender模板打印标签
  17. 一种灵活可靠的工作方式:组件化设计与开发
  18. 阿里云ClickHouse海量数据分析
  19. Android 悬浮窗的使用(2)
  20. 闲鱼无货源怎样选品,能够做到日入几百?

热门文章

  1. 安卓各种传感器的使用
  2. 网页内嵌百度地图位置定位
  3. 【东方博宜】【入门】2016--旅游景点大排名
  4. 你了解VMware和VMware认证吗?
  5. C语言——命令行参数
  6. 分享十条Java后端开发实战经验,干货满满!
  7. 欧债危机再生变数,欧元续创年内新低
  8. 关于 tar zxvf 的解释
  9. imgaug数据增强神器:第四章 增强关键点/界标
  10. 【海外社交】海外社交平台有哪些值得2023年关注以及运营?