ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

设计模式行为型——模板模式

设计模式行为型——模板模式 目录模板模式的定义模板模式的实现模板模式角色模板模式类图模板模式举例模板模式代码实现模板模式的特点优点缺点使用场景注意事项实际应用模板模式的定义模板模式Template Pattern属于行为型设计模式又叫模版方法模式(Template Method Pattern)是指定义一个算法的骨架并允许子类为一个或多个步骤提供实现。模板模式使得子类可以在不改变算法结构的情况下重新定义算法的某些步骤。模板模式其主要的的思想就是做一个模板提供给客户端进行调用。除去生活中我们经常用到的简历模板、合同模板等等Java中也有很经典的模板使用那就是ServletHttpService类提供了一个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 关键词实际应用数据库访问操作数据库访问操作中的连接、查询和关闭等操作可以使用模板模式将通用的操作提取到父类中而具体的查询可以由子类来实现。游戏开发中的关卡设计在游戏开发中不同的关卡可能有相同的初始化、更新和结束等步骤可以使用模板模式来实现这些关卡。
返回列表