面试题答案
一键面试适合使用模板方法模式的业务场景
- 报表生成:不同类型的报表(如日报、周报、月报)生成逻辑大致相同,都包含数据查询、数据处理、报表格式化等步骤,但每个步骤的具体实现可能不同。例如在财务报表生成中,日报、月报都需要从数据库获取数据,但获取的数据范围和计算方式有差异。
- 游戏开发中的角色创建流程:创建不同类型的角色(如战士、法师、刺客),都有选择角色种族、分配初始属性、选择技能等相似步骤,但具体每个步骤对于不同角色有不同的设定。
- 文件处理:读取不同格式文件(如txt、csv、xml),都有打开文件、读取内容、关闭文件的流程,但读取内容的方式不同。
通过模板方法模式设计相关类和方法
- 定义抽象类
public abstract class AbstractReportGenerator { // 模板方法 public final void generateReport() { queryData(); processData(); formatReport(); } // 具体子类实现的抽象方法 protected abstract void queryData(); protected abstract void processData(); protected abstract void formatReport(); }
- 创建具体子类
public class DailyReportGenerator extends AbstractReportGenerator { @Override protected void queryData() { // 实现日报数据查询逻辑 System.out.println("查询日报数据"); } @Override protected void processData() { // 实现日报数据处理逻辑 System.out.println("处理日报数据"); } @Override protected void formatReport() { // 实现日报格式化逻辑 System.out.println("格式化日报"); } }
public class MonthlyReportGenerator extends AbstractReportGenerator { @Override protected void queryData() { // 实现月报数据查询逻辑 System.out.println("查询月报数据"); } @Override protected void processData() { // 实现月报数据处理逻辑 System.out.println("处理月报数据"); } @Override protected void formatReport() { // 实现月报格式化逻辑 System.out.println("格式化月报"); } }
- 使用示例
public class Main { public static void main(String[] args) { AbstractReportGenerator dailyReport = new DailyReportGenerator(); dailyReport.generateReport(); AbstractReportGenerator monthlyReport = new MonthlyReportGenerator(); monthlyReport.generateReport(); } }
在上述代码中,AbstractReportGenerator
类定义了一个模板方法generateReport
,它规定了报表生成的整体流程。具体的查询数据、处理数据和格式化报表的逻辑由具体子类DailyReportGenerator
和MonthlyReportGenerator
来实现,从而实现业务流程的标准化。