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

模板方法模式(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();
    }
}

执行结果:

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

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

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

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

相关推荐
IT机器猫10 分钟前
RabbitMQ基础二
java·spring boot·分布式·spring cloud·log4j·rabbitmq·springamqp
卷心菜的学习路20 分钟前
基于 Spring Cloud Tencent 元数据路由实现个人开发泳道,告别频繁部署
java·spring cloud
xieliyu.1 小时前
UPD协议结构以及开发中注意事项
java·开发语言·笔记·java-ee
张宇Joaquin1 小时前
openEuler编译和更换内核的方法
java·linux·服务器
程序员黑豆1 小时前
Java正则表达式详解
java·前端·ai编程
Flynt2 小时前
我试了Spring Boot 4的原生镜像,聊聊那些数字和坑
java·spring boot
M-Robots echo9 小时前
轻量化裁剪方案解析:M-Robots 模块化构建,适配高低端各类机器人硬件平台
java·机器人·ros·开源社区·atomgit·m-robots
不可求~10 小时前
多模型路由怎么落地:把任务分流写进项目的最小实现
java·前端·数据库
mldong10 小时前
用 DDD 设计工作流引擎:聚合根与充血模型
java·架构
mqiqe11 小时前
AgentScope Java Harness:4. 双层记忆系统 让 Agent 拥有真正的“长期大脑“
java·开发语言