当前位置: 首页 > news >正文

模板方法模式(Template Method Pattern)

模板方法模式(Template Method Pattern)是一种行为型设计模式,它定义了一个操作中的算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以不改变一个算法的结构即可重新定义算法的某些特定步骤。

主要角色

  1. 抽象类(Abstract Class):定义了一个或多个抽象操作,以便让子类实现。这些抽象操作叫做基本操作,它们是一个顶级逻辑的一部分,而顶级逻辑的定义则在一个叫做模板方法的方法中。

  2. 具体子类(Concrete Classes):实现父类所定义的一个或多个抽象方法。

  3. 模板方法(Template Method):这是定义在抽象类中的具体方法。模板方法定义了算法的骨架,它会调用一个或多个抽象方法。

工作原理

  • 模板方法模式通过定义一个操作中的算法的骨架,将一些步骤延迟到子类中实现。
  • 模板方法使得子类可以在不改变算法结构的前提下,重新定义算法的某些步骤。
  • 模板方法模式是一种代码复用技术,它在类库设计中尤为重要,它提取了类库中的公共行为,将公共行为放在父类中,而通过钩子(Hook)方法让子类覆盖以实现特定的行为。

优点

  1. 封装不变部分,扩展可变部分:把认为是不变部分的算法封装在抽象父类中,而可变部分则允许子类继承去实现。
  2. 提高代码复用性:不需要改变算法的结构即可重新定义算法的某些特定步骤。
  3. 符合开闭原则:对扩展开放,对修改关闭,增加新的功能符合开闭原则。

缺点

  • 需要为每一个基本方法都提供一个钩子(Hook)方法,这可能会增加很多子类,过度设计。
  • 在使用模板方法模式时要小心不要违反里氏替换原则(Liskov Substitution Principle)。

示例

我们将以一个简单的游戏角色创建过程为例,展示模板方法模式的应用。在这个例子中,我们将有一个游戏角色基类(GameCharacter),它定义了一个创建角色的算法骨架,包括初始化属性、选择武器和装备防具等步骤。然后,我们将有两个具体的子类,分别代表战士(Warrior)和法师(Mage),它们将实现这些步骤中的特定细节。

// 抽象类  
abstract class GameCharacter {  // 模板方法  final void createCharacter() {  initializeAttributes();  chooseWeapon();  equipArmor();  }  // 基本方法,由子类实现  abstract void initializeAttributes();  abstract void chooseWeapon();  abstract void equipArmor();  // 可以选择添加一些通用方法或钩子方法  void displayCharacter() {  System.out.println("Character created successfully!");  }  
}  // 具体子类:战士  
class Warrior extends GameCharacter {  @Override  void initializeAttributes() {  System.out.println("Initializing Warrior attributes...");  // 设置力量、耐力等属性  }  @Override  void chooseWeapon() {  System.out.println("Warrior chooses a sword as his weapon.");  }  @Override  void equipArmor() {  System.out.println("Warrior equips heavy armor.");  }  
}  // 具体子类:法师  
class Mage extends GameCharacter {  @Override  void initializeAttributes() {  System.out.println("Initializing Mage attributes...");  // 设置智力、魔法值等属性  }  @Override  void chooseWeapon() {  System.out.println("Mage chooses a staff as his weapon.");  }  @Override  void equipArmor() {  System.out.println("Mage equips robes for armor.");  }  
}  // 客户端代码  
public class TemplateMethodPatternDemo2 {  public static void main(String[] args) {  GameCharacter warrior = new Warrior();  warrior.createCharacter();  warrior.displayCharacter();  GameCharacter mage = new Mage();  mage.createCharacter();  mage.displayCharacter();  }  
}

在这个例子中,GameCharacter类定义了一个创建游戏角色的算法骨架,即模板方法createCharacter。这个方法调用了三个抽象方法:initializeAttributeschooseWeaponequipArmor,这些方法由具体的子类(WarriorMage)来实现,以提供创建不同类型角色所需的特定细节。

通过模板方法模式,我们能够在不改变创建角色算法结构的前提下,通过扩展具体的子类来创建不同类型的游戏角色。此外,我们还可以在GameCharacter类中添加更多的通用方法或钩子方法,以进一步增强该模式的灵活性和可扩展性。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 三数之和-Leetcode
  • 深入理解 Vuex:Vue.js 应用的状态管理
  • 《最新出炉》系列小成篇-Python+Playwright自动化测试-66 - 等待元素至指定状态(出现、移除、显示和隐藏)
  • mysql数据库:SQL语言基础和基本查询
  • 黑马Java零基础视频教程精华部分_16_递归算法
  • QT下载与安装
  • 第25课 Scratch入门篇:火箭升空
  • 2024下半年国际学术会议一览表
  • 学懂C++ (十四):高级教程——C++ 动态内存管理(new和delete)详解
  • Cmake基础教程--第1章:初识cmake
  • python实现返回指定下标位置的 斐波那契数列[1,1,2,3,5,8,13,21,34....n] 数值
  • 基于Springboot + Vue的宿舍管理系统
  • 思特威正式发布子品牌飞凌微,首发产品定位智驾视觉处理
  • chromedriver版本下载地址汇总chromedriver所有版本下载地址汇总国内源下载
  • 在 Mac 上恢复永久删除的文件:分步指南
  • 【108天】Java——《Head First Java》笔记(第1-4章)
  • 【跃迁之路】【669天】程序员高效学习方法论探索系列(实验阶段426-2018.12.13)...
  • 2017 前端面试准备 - 收藏集 - 掘金
  • Android 架构优化~MVP 架构改造
  • Create React App 使用
  • docker python 配置
  • Hibernate【inverse和cascade属性】知识要点
  • Java读取Properties文件的六种方法
  • Laravel 中的一个后期静态绑定
  • React-生命周期杂记
  • Redis字符串类型内部编码剖析
  • 初识MongoDB分片
  • 反思总结然后整装待发
  • 世界上最简单的无等待算法(getAndIncrement)
  • 算法系列——算法入门之递归分而治之思想的实现
  • 通过来模仿稀土掘金个人页面的布局来学习使用CoordinatorLayout
  • 为视图添加丝滑的水波纹
  • 项目管理碎碎念系列之一:干系人管理
  • 新版博客前端前瞻
  • 正则与JS中的正则
  • ​Python 3 新特性:类型注解
  • ​ubuntu下安装kvm虚拟机
  • # 深度解析 Socket 与 WebSocket:原理、区别与应用
  • #QT(串口助手-界面)
  • #控制台大学课堂点名问题_课堂随机点名
  • #数据结构 笔记一
  • #我与Java虚拟机的故事#连载18:JAVA成长之路
  • (27)4.8 习题课
  • (LLM) 很笨
  • (poj1.3.2)1791(构造法模拟)
  • (Python) SOAP Web Service (HTTP POST)
  • (void) (_x == _y)的作用
  • (笔记)Kotlin——Android封装ViewBinding之二 优化
  • (动手学习深度学习)第13章 计算机视觉---图像增广与微调
  • (二)斐波那契Fabonacci函数
  • (非本人原创)我们工作到底是为了什么?​——HP大中华区总裁孙振耀退休感言(r4笔记第60天)...
  • (附源码)计算机毕业设计SSM智慧停车系统
  • (六)Hibernate的二级缓存
  • (七)Knockout 创建自定义绑定
  • (深入.Net平台的软件系统分层开发).第一章.上机练习.20170424