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

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

执行结果:

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

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

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

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

相关推荐
云烟成雨TD1 天前
Spring AI Alibaba 1.x 系列【6】ReactAgent 同步执行 & 流式执行
java·人工智能·spring
于慨1 天前
Lambda 表达式、方法引用(Method Reference)语法
java·前端·servlet
swg3213211 天前
Spring Boot 3.X Oauth2 认证服务与资源服务
java·spring boot·后端
gelald1 天前
SpringBoot - 自动配置原理
java·spring boot·后端
殷紫川1 天前
深入理解 AQS:从架构到实现,解锁 Java 并发编程的核心密钥
java
一轮弯弯的明月1 天前
贝尔数求集合划分方案总数
java·笔记·蓝桥杯·学习心得
chenjingming6661 天前
jmeter线程组设置以及串行和并行设置
java·开发语言·jmeter
殷紫川1 天前
深入拆解 Java volatile:从内存屏障到无锁编程的实战指南
java
eddieHoo1 天前
查看 Tomcat 的堆内存参数
java·tomcat
那个失眠的夜1 天前
Mybatis延迟加载策略
xml·java·数据库·maven·mybatis