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

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

执行结果:

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

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

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

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

相关推荐
a35354138213 小时前
设计模式-代理模式
c++·设计模式·代理模式
野生的码农20 小时前
码农的妇产科实习记录
android·java·人工智能
毕设源码-赖学姐21 小时前
【开题答辩全过程】以 高校人才培养方案管理系统的设计与实现为例,包含答辩的问题和答案
java
一起努力啊~1 天前
算法刷题-二分查找
java·数据结构·算法
小途软件1 天前
高校宿舍访客预约管理平台开发
java·人工智能·pytorch·python·深度学习·语言模型
J_liaty1 天前
Java版本演进:从JDK 8到JDK 21的特性革命与对比分析
java·开发语言·jdk
+VX:Fegn08951 天前
计算机毕业设计|基于springboot + vue律师咨询系统(源码+数据库+文档)
java·数据库·vue.js·spring boot·后端·课程设计
daidaidaiyu1 天前
一文学习和实践 当下互联网安全的基石 - TLS 和 SSL
java·netty
hssfscv1 天前
Javaweb学习笔记——后端实战2_部门管理
java·笔记·学习
NE_STOP1 天前
认识shiro
java