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

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

执行结果:

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

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

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

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

相关推荐
m0_5873830020 分钟前
外卖CPS系统开发实战:从架构设计到运营落地全指南
java·spring·小程序·架构·需求分析
zhangzeyuaaa21 分钟前
Python asyncio 事件循环演进:从手动管理到现代化实践
java·服务器·python
学编程就要猛1 小时前
流式编程及Spring中SSE实现
java·后端·spring·流式编程
随遇而安zx1 小时前
【多线程】---ConcurrentHashMap 源码解析
java·多线程·并发
不才不才不不才1 小时前
Spring 源码系列(27): @Transactional 七大失效场景与源码归因
java·后端·spring
随遇而安zx1 小时前
【多线程】---线程池 ThreadPoolExecutor 原理与调优
java·线程池·多线程
抠脚小弟1 小时前
WebSocketServer 使用详解:从入门到实战
java·spring·websocketserver
随便做点啥1 小时前
32卡64G-910B4-16后端集群部署报告
java·大数据·运维
Wang's Blog2 小时前
Java框架快速入门: Spring Security+OAuth2之字段验证与自定义验证注解实战
java·算法·spring
CodeStats2 小时前
【Java 类加载器】Java 类加载器完整体系深度拆解(上):从 JVM 启动到双亲委派模型
java·开发语言·jvm·classloader·双亲委派