模板模式学习

定义:

模板方法模式是类的行为模式。准备一个抽象类,将部分逻辑以具体方法以及具体构造函数的形式实现,然后声明一些抽象方法来迫使子类实现剩余的逻辑。不同的子类可以以不同的方式实现这些抽象方法,从而对剩余的逻辑有不同的实现。这就是模板方法模式的用意。

简单实现:

  抽象模板(Abstract Template)角色有如下责任:

  ■  定义了一个或多个抽象操作,以便让子类实现。这些抽象操作叫做基本操作,它们是一个顶级逻辑的组成步骤。

  ■  定义并实现了一个模板方法。这个模板方法一般是一个具体方法,它给出了一个顶级逻辑的骨架,而逻辑的组成步骤在相应的抽象操作中,推迟到子类实现。顶级逻辑也有可能调用一些具体方法。

 1 package org.codewy.pattern.template;
 2
 3 /**
 4  * 模板模式抽象类
 5  */
 6 public abstract class Game {
 7
 8     String name;
 9
10     protected Game(String name) {
11         this.name = name;
12     }
13
14     abstract void initialize();
15
16     abstract void startPlay();
17
18     abstract void endPlay();
19
20     abstract void deleteGame();
21
22     // 钩子方法
23     boolean isDeleteGame() {
24         return false;
25     }
26
27     // 模板方法
28     public final void play() {
29
30         initialize();
31
32         startPlay();
33
34         endPlay();
35
36         if (isDeleteGame()) {
37             deleteGame();
38         }
39
40     }
41
42 }

  具体模板(Concrete Template)角色又如下责任:

  ■  实现父类所定义的一个或多个抽象方法,它们是一个顶级逻辑的组成步骤。

  ■  每一个抽象模板角色都可以有任意多个具体模板角色与之对应,而每一个具体模板角色都可以给出这些抽象方法(也就是顶级逻辑的组成步骤)的不同实现,从而使得顶级逻辑的实现各不相同。

 1 package org.codewy.pattern.template;
 2
 3 public class LOL extends Game {
 4
 5     public LOL(String name) {
 6         super(name);
 7     }
 8
 9     @Override
10     void initialize() {
11         System.out.println(name + "初始化LOL游戏");
12     }
13
14     @Override
15     void startPlay() {
16         System.out.println(name + "开始LOL游戏");
17     }
18
19     @Override
20     void endPlay() {
21         System.out.println(name + "结束LOL游戏");
22     }
23
24     @Override
25     void deleteGame() {
26         System.out.println(name + "删除了LOL游戏");
27     }
28
29 }
 1 package org.codewy.pattern.template;
 2
 3 public class PUBG extends Game {
 4
 5     private boolean isDeleteGame;
 6
 7     public PUBG(String name) {
 8         super(name);
 9     }
10
11     public PUBG(String name, boolean isDeleteGame) {
12         this(name);
13         this.isDeleteGame = isDeleteGame;
14     }
15
16     @Override
17     void initialize() {
18         System.out.println(name + "初始化PUBG游戏");
19     }
20
21     @Override
22     void startPlay() {
23         System.out.println(name + "开始PUBG游戏");
24     }
25
26     @Override
27     void endPlay() {
28         System.out.println(name + "结束PUBG游戏");
29     }
30
31     @Override
32     void deleteGame() {
33         System.out.println(name + "删除了PUBG游戏");
34     }
35
36     @Override
37     boolean isDeleteGame() {
38         return isDeleteGame;
39     }
40
41 }

测试Demo:

 1 package org.codewy.pattern.template;
 2
 3 public class TemplatePatternDemo {
 4
 5     public static void main(String[] args) {
 6         Game lol = new LOL("老大王颖");
 7         Game pubg = new PUBG("小弟李乐", true);
 8         lol.play();
 9         pubg.play();
10     }
11
12 }

运行结果:

 开源框架的实际应用场景:

1、HttpServlet

  实现一个servlet需要继承HttpServlet,HttpServlet就用到了模板模式,HttpServlet定义了模板方法service(),基本方法doGet(),doPost()等,我们自己的实现类重写doGet(),doPost(),再根据父类的大致流程来实现我们的详细逻辑。

2、SpringMVC

  HandlerInterceptor接口定义了preHandle(),postHandle(),afterCompletion()方法,拦截器的实现类实现这些方法。

  

在SpringMVC的前端控制器DispatcherServlet类中定义了模板方法

 总结:

  1、在多个子类中拥有相同的方法,而且逻辑相同时,可以将这些方法抽出来放到一个模板抽象类中。

  2、程序主框架相同,细节不同的情况下,也可以使用模板方法。

原文地址:https://www.cnblogs.com/codewy/p/11565128.html

时间: 2024-11-26 01:28:13

模板模式学习的相关文章

学习笔记——模板模式Template

模板模式,主要是利用多态来实现具体算法和父类逻辑的松耦合.父类中TemplateMethod内部定义了相应的算法操作顺序,子类负责实现相应的具体实现. 举例: 项目中曾遇到过一个需求,叫做高级价格体系.它对外的调用接口一致,只是在不同的应用场景下(比如普通消费和会员卡消费)计算方法有差异,简化计算流程: 1.初始化相应数据A() 2.执行价格计算B() 3.计算完成后的提示C() 等. 父类中的接口函数Run()将此顺序固定为: Run() { A(); B(); C(); } 不同场景下的子类

设计模式之 - 模板模式(Template Pattern)

引入:这几天在看一本讲spring源码的书<SPRING技术内幕>里面在讲加载配置文件的时候,可以有不同的加载方式,如根据文件系统目录加载配置文件(FileSystemXmlApplicationContext),类路径加载配置文件(ClassPathXmlApplicationContext),以及根据项目上下文目录(XmlWebApplicationContext)加载配置文件.这个在加载的过程中就使用了模板设计模式,所以就来学习下模板设计模式. 1. 模板设计模式在书中定义:  定义一个

C++标准模板库学习。。。

作为C++标准库相当重要的一部分,STL库提供一系列组件操作.它主要可以分为容器.迭代器.基本算法.函数对象以及内存分配器和配接器六个部分.整个STL库的代码都采用模板函数以及模板类的方式实现,具有高度的通用性.对于传统的应用程序来讲,模板库支持并且倡导一种新的编程风格,即称为泛型编程思想,以通用的模板方式来编写应用程序中的数据结构与算法. 16.1  STL常见容器 C++标准STL库中封装实现了常见数据结构,并以容器的方式提供给用户使用.STL容器主要包含vector向量.deque队列.l

Java设计模式之模板模式(Template )

前言: 最近学习了Glide开源图片缓存框架,在学习到通过使用ModelLoader自定义数据源的时候,Glide巧妙的使用了Java的模板模式来对外暴露处理不同的Url数据源,今天来学习总结一下模板模式. 模板模式(Template ): 模板方法模式是类的行为模式.准备一个抽象类,将部分逻辑以具体方法以及具体构造函数的形式实现,然后声明一些抽象方法来迫使子类实现剩余的逻辑.不同的子类可以以不同的方式实现这些抽象方法,从而对剩余的逻辑有不同的实现.这就是模板方法模式的用意. 模式中的角色 抽象

设计模式——模板模式

模板模式: 准备一个抽象类,讲部分逻辑以具体方法的形式实现,然后声明一些抽象方法交由子类实现剩余逻辑,用钩子方法给予子类更大的灵活性.最后将方法汇总构成一个不可改变的模板方法. 适用场景 1 算法或操作遵循相似的逻辑 2 重构时(把相同的代码抽取到分类) 优势: 1 封装性好 2 复用性好 3 疲敝细节 4 便于维护 缺点 1   继承 源码: RefreshBeverage package com.imooc.pattern.template; /**  * 抽象基类,为所有的子类提供一个算法

《设计模式》- 模板模式

模板模式在诸多模式中算是比较简单的一个,即便一个新手,也能很快的上手和使用.虽然简单,但合理的在项目中使用带来的好处可不小.软件设计中有个很重要的原则:DRY(Don't Repeat Yourself),重复有很多种,比如代码重复,逻辑重复,而模板模式的最拿手的就是消除逻辑重复. 我们先看一下模板模式的定义:在一个方法中定义一个算法的骨架,而将一些步骤延迟到子类中去实现.模板方法使得子类可以在不改变算法结构的情况下,重新定义算法中的某些步骤.只要你学习过任何一门面向对象语言,那么理解上面的定义

Head First 设计模式系列之一----模板模式

开篇序言:四人帮的设计模式对于我这个菜鸟看着打瞌睡,后面果断买了一本head first的,感觉还可以像看报纸似的,花了一个寒假的晚上看了大半,确实内容也挺吸引人的,讲的很风趣.否则我也不可能,大过年的小伙伴们还在外面耍,自己还在那里装B.可是看完的困惑也随之而来,我怎么才能熟练的操练这些模式呢!书上讲的头头是道,可是实际中我们确不知道怎么运用!后面看到别人牛逼的都是随便一个模式都能脱口面而出,还有就是实际项目接触多了,肯定也有一定的职业嗅觉!所以希望自己也能够通过写博客,让自己对设计模式有一个

(转)DEDECMS模板原理、模板标签学习 - .Little Hann

本文,小瀚想和大家一起来学习一下DEDECMS中目前所使用的模板技术的原理: 什么是编译式模板.解释式模板,它们的区别是什么? 模板标签有哪些种类,它们的区别是什么,都应用在哪些场景? 学习模板的机制原理对我们修复目前CMS中常出现的模板类代码执行的漏洞能起到怎样的帮助? 带着这些问题,我们进入今天的代码研究,just hacking for fun!! 文章主要分为以下几个部分 1. 模板基本知识介绍 2. 怎么使用模板机制.模板标签的使用方法 3. DEDE模板原理学习 1) 编译式模板 2

模板模式(Template Pattern)

引入:这几天在看一本讲spring源码的书<SPRING技术内幕>里面在讲加载配置文件的时候,可以有不同的加载方式,如根据文件系统目录加载配置文件(FileSystemXmlApplicationContext),类路径加载配置文件(ClassPathXmlApplicationContext),以及根据项目上下文目录(XmlWebApplicationContext)加载配置文件.这个在加载的过程中就使用了模板设计模式,所以就来学习下模板设计模式. 1. 模板设计模式在书中定义:  定义一个