目录
模板模式的定义
模板模式的实现
模板模式角色
模板模式类图
模板模式举例
模板模式代码实现
模板模式的特点
优点
缺点
使用场景
注意事项
实际应用
模板模式的定义
模板模式(Template Pattern)属于行为型设计模式,又叫模版方法模式(Template Method Pattern),是指定义一个算法的骨架,并允许子类为一个或多个步骤提供实现。模板模式使得子类可以在不改变算法结构的情况下,重新定义算法的某些步骤。
模板模式,其主要的的思想就是做一个模板,提供给客户端进行调用。除去生活中我们经常用到的简历模板、合同模板等等,Java中也有很经典的模板使用,那就是Servlet,HttpService类提供了一个service()方法,这个方法调用七个do方法中的一个或几个,完成对客户端调用的响应。这些do方法需要由HttpServlet的具体则由子类提供。
模板模式的实现
模板模式角色
- 抽象模板角色(Abstract Template):定义了一个或多个抽象操作,即定义了算法的骨架,以便让子类实现。这些抽象操作叫做基本操作,它们是一个顶级逻辑的组成步骤;定义并实现了一个模板方法。这个模板方法一般是一个具体方法,它给出了一个顶级逻辑的骨架,而逻辑的组成步骤在相应的抽象操作中,推迟到子类实现。顶级逻辑也有可能调用一些具体方法。
- 具体模板角色(Concrete Template):实现父类所定义的一个或多个抽象方法,即不同的对象的具体实现细节,它们是一个顶级逻辑的组成步骤;每一个抽象模板角色都可以有任意多个具体模板角色与之对应,而每一个具体模板角色都可以给出这些抽象方法(也就是顶级逻辑的组成步骤)的不同实现,从而使得顶级逻辑的实现各不相同。
模板模式类图
模板模式举例
相信大家都吃过水果蛋糕,不过无论造型如何变化,不变的有两种东西:“奶油”和“面包”。其余的水果材料随意搭配,就凑成了各式各样的水果蛋糕。基于这个场景,写一个案例,进一步了解下模板模式;创建三个类:Cake(蛋糕)、StrawberryCake(草莓蛋糕)、MangoCake(芒果蛋糕)。最后创建一个Client类,实现这个制作蛋糕的调用过程。
模板模式代码实现
抽象模版角色
package com.common.demo.pattern.template;
/**
* @author Evan Walker 昂焱数据: https://www.ayshuju.com
* @version 1.0
* @desc 抽象模版角色 蛋糕
* @date 2023/08/09 13:44:38
*/
public abstract class Cake {
/**
* 制作
*/
public void make() {
System.out.println("开始准备材料。");
bread();
cream();
fruit();
System.out.println("经过一系列的操作。");
System.out.println("制作完成。");
}
/**
* 准备面包
*/
public void bread() {
System.out.println("准备材料:面包");
}
/**
* 准备奶油
*/
public void cream() {
System.out.println("准备材料:奶油");
}
/**
* 准备水果
*/
protected abstract void fruit();
}
具体模版角色
package com.common.demo.pattern.template;
/**
* @author Evan Walker 昂焱数据: https://www.ayshuju.com
* @version 1.0
* @desc 具体模版角色:芒果蛋糕
* @date 2023/08/09 13:46:07
*/
public class MangoCake extends Cake{
@Override
protected void fruit() {
System.out.println("准备材料:芒果");
}
}
package com.common.demo.pattern.template;
/**
* @author Evan Walker 昂焱数据: https://www.ayshuju.com
* @version 1.0
* @desc 具体模版角色:草莓蛋糕
* @date 2023/08/09 13:46:07
*/
public class StrawberryCake extends Cake{
@Override
protected void fruit() {
System.out.println("准备材料:草莓");
}
}
测试代码
package com.common.demo.pattern.template;
/**
* @author Evan Walker 昂焱数据: https://www.ayshuju.com
* @version 1.0
* @desc 测试类
* @date 2023/08/09 13:48:06
*/
public class Test {
public static void main(String[] args) {
Cake c1 = new MangoCake();
c1.make();
Cake c2 = new StrawberryCake();
c2.make();
}
}
测试截图
模板模式的特点
优点
- 提高代码复用性:模板模式将公共的算法提取到父类中,子类只需关注实现自己特定的步骤,提高了代码的复用性。
- 保持一致的算法结构:模板模式定义了算法的框架,保持了一致的算法结构,使得代码更加整洁和可读。
- 灵活性:子类可以根据需要重写或扩展父类中的某些算法步骤,从而实现定制化的算法。
缺点
- 某些步骤的实现可能受限:由于模板模式是通过继承来实现的,因此可能会限制某些步骤的具体实现方式。
- 增加了类的数量:使用模板模式会增加父类和子类的数量,可能导致类的层次结构较为复杂。
使用场景
- 当有一组相似的算法,其具体实现步骤相同或类似,只有某些步骤的实现有差异时,可以考虑使用模板模式。
- 当需要保持一致的算法结构,提高代码复用性和可维护性时,可以使用模板模式。
注意事项
- 抽象出公共的算法框架:在使用模板模式时,需要抽象出算法的公共框架,并将可变的部分延迟到子类中实现。
- 父类对于子类的要求:父类中定义的模板方法可以使用钩子方法来约束子类的行为。
- 为防止恶意操作:一般模板方法都加上 final 关键词
实际应用
- 数据库访问操作:数据库访问操作中的连接、查询和关闭等操作可以使用模板模式,将通用的操作提取到父类中,而具体的查询可以由子类来实现。
- 游戏开发中的关卡设计:在游戏开发中,不同的关卡可能有相同的初始化、更新和结束等步骤,可以使用模板模式来实现这些关卡。
更多消息资讯,请访问昂焱数据(https://www.ayshuju.com)