二十三种设计模式(十三)--模板方法模式

模板方法模式(Template Method)

模板方法模式将算法流程与算法具体实现相分离的结构.

首先, 定义一个抽象类, 抽象类中有一个不可重写的final方法, 这个方法中封装核心的算法流程, 但这个流程中只有方法调用, 没有具体实现.

具体的方法实现由子类完成, 一些方法是抽象方法, 子类必须实现, 另一些方法则是钩子方法, 子类选择性实现.

代码示例:

java 复制代码
// 模板方法类, 只定义核心逻辑, 提供算法框架, 不进行具体实现
abstract class Hero {
    // 这个createHero方法中定义固定的逻辑, 所有子类都遵循这里的顺序
    // 有些方法子类必须实现, 也有部分钩子方法子类可选择性实现
    public final void createHero() {
        try {
            System.out.print("身形: ");
            createBody();

            System.out.print("肌肉: ");
            if (createMuscles()) {
                System.out.println("     身形健硕, 极其勇猛");
            } else {
                System.out.println("无");
            }

            System.out.print("武器: ");
            if (createWeapon()) {
                System.out.println("     真理面前, 众生平等");
            } else {
                System.out.println("没有武器");
            }

            System.out.print("技能: ");
            createSkill();

            System.out.print("头戴: ");
            createHat();

            System.out.print("名号: ");
            sayName();

        } catch (Exception e) {
            System.out.println("[Exception] " + e.getMessage());
        }
    }

    abstract  void createHat();

    abstract void createSkill();

    abstract void createBody();

    // 钩子方法
    boolean createMuscles() {
        return false;
    }

    boolean createWeapon() {
        return false;
    }

    abstract void sayName();
}


class ZhangFei extends Hero {
    @Override
    void createHat() {
        System.out.println("黑帅盔");
    }

    @Override
    void createBody() {
        System.out.println("身高七尺,皮肤黝黑");
    }

    @Override
    void createSkill() {
        System.out.println("声如洪钟, 骁勇善战");
    }

    @Override
    void sayName() {
        System.out.println("燕人张飞张翼德");
    }

    @Override
    boolean createMuscles() {
        System.out.println("肌肉发达, 耐力非比寻常");
        return true;
    }

    @Override
    boolean createWeapon() {
        System.out.println("丈八蛇矛");
        return true;
    }
}

class LvBu extends Hero {
    @Override
    void createHat() {
        System.out.println("紫金冠");
    }

    @Override
    void createBody() {
        System.out.println("身高八尺,英俊无比");
    }

    @Override
    void createSkill() {
        System.out.println("辕门射戟神技, 战力非凡");
    }

    @Override
    void sayName() {
        System.out.println("九原吕布吕奉先");
    }

    @Override
    boolean createMuscles() {
        System.out.println("肌肉结实,身材魁梧");
        return true;
    }

    @Override
    boolean createWeapon() {
        System.out.println("方天画戟");
        return true;
    }
}

调用及执行:

java 复制代码
public class TemplateMethodPattern {
    public static void main(String[] args) {
        ZhangFei zhangfei = new ZhangFei();
        zhangfei.createHero();
        System.out.println("=================");
        LvBu lvbu = new LvBu();
        lvbu.createHero();
    }
}

执行结果:

复制代码
身形: 身高七尺,皮肤黝黑
肌肉: 肌肉发达, 耐力非比寻常
     身形健硕, 极其勇猛
武器: 丈八蛇矛
     真理面前, 众生平等
技能: 声如洪钟, 骁勇善战
头戴: 黑帅盔
名号: 燕人张飞张翼德
=================
身形: 身高八尺,英俊无比
肌肉: 肌肉结实,身材魁梧
     身形健硕, 极其勇猛
武器: 方天画戟
     真理面前, 众生平等
技能: 辕门射戟神技, 战力非凡
头戴: 紫金冠
名号: 九原吕布吕奉先

模板方法能够让子类只实现算法的局部功能, 而不是去实现整个算法结构, 在实际开发中有效分离算法与实现.

在思考一个算法时, 考虑有哪些共同的步骤是在各种情况中反复出现的, 把他们都分步抽出来,

然后各种情况的实现类去实现这些有差异的部分

相关推荐
萧瑟余晖10 分钟前
JDK 26 新特性详解
java·开发语言
马优晨1 小时前
Freemarker 完整讲解(后端 Java 模板引擎)
java·开发语言·freemarker·freemarker 完整讲解·freemarker模板引擎
维天说3 小时前
CLI-Switch 2026年3月版历史设计:Hook、TTY 隔离与 JSON 状态
java·服务器·json
Zane19944 小时前
并发 vs 并行:别再傻傻分不清了,一文讲透 Java 并发编程的第一课
java·后端
杨充5 小时前
11.DDD与战术建模
设计模式·开源·代码规范
杨充5 小时前
12.综合实战图片框架
设计模式·开源·代码规范
噢,我明白了5 小时前
java中Excel的导入和导出(EasyExcel)
java·开发语言·excel
吠品5 小时前
Zabbix Web界面误报Server未运行的排查与解决
java·服务器·数据库
啊湘5 小时前
天气查询API接口 按月Token鉴权 实时天气 物联网可用 文档齐全
java·后端·struts
Java内核笔记5 小时前
告别十亿美元的错误 : Spring Boot 4 空安全 (JSpecify) 实战
java·spring boot·后端