Java设计模式——模板方法模式

简介: Java设计模式——模板方法模式

一、引言

23种设计模式大概分为三大类:


5种(创建型模式):工厂方法模式、抽象工厂模式、单例模式、原型模式、建造者模式。


7种(结构型模式):适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式。


11种(行为型模式):策略模式、模板方法模式、观察者模式、迭代器模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式。

行为型又可以通过类与类之间的关系进行划分 :

image.png

模板方法模式基本介绍:

模板方法模式(Template Method Pattern),又叫模板模式(Template Pattern),在一个抽象类公开定义了执行它的方法的模板。它的子类可以按需要重写方法实现,但调用将以抽象类中定义的方式进行。
简单说,模板方法模式,定义一个操作中的算法的骨架,而将一些步骤延迟到子类中,使得子类可以不改变一个算法的结构,就可以重定义该算法的某些特定步骤,这种类型的设计模式属于行为型模式。

二、模板方法模式

1.模板方法模式原理类图

image.png

对原理类图的说明:

AbstractClass 抽象类, 类中实现了模板方法(template),定义了算法的骨架,具体子类需要去实现 其它的抽象方法 operation2,3,4
ConcreteClass 实现抽象方法,假设是operation2,3,4, 以完成算法中特定子类的具体业务步骤

三、具体需求

1.豆浆制作

编写制作豆浆的程序,说明如下:

  • 制作豆浆的流程:选材—>添加配料—>浸泡—>放到豆浆机打碎
  • 通过添加不同的配料,可以制作出不同口味的豆浆
  • 选材、浸泡和放到豆浆机打碎这几个步骤对于制作每种口味的豆浆都是一样的
说明:因为模板方法模式,比较简单,很容易就想到这个方案,因此就直接使用,不再使用传统的方案来引出模板方法模式

2. 模板方法模式方案

思路分析 - 类图

image.png

1.抽象类,表示豆浆

package java设计模式.Template;
// 抽象类,表示豆浆 SoyaMilk.java
public abstract class SoyaMilk {
    // 模板方法:可以做成final,不让子类去覆盖
    final void make(){
        select();
        addCondiment();
        soak();
        beat();

    }
    //选材料
    void select() { System.out.println("第一步:选择新鲜的豆子"); }
    //添加不同的配料:抽象方法,由子类具体实现
    abstract void addCondiment();
    //浸泡
    void soak() { System.out.println("第三步:豆子和配料开始浸泡3H"); }
    //榨汁
    void beat() { System.out.println("第四步:豆子和配料放入豆浆机榨汁"); }

}

2. 实现抽象方法

package java设计模式.Template;

public class RedBeanSoyaMilk extends SoyaMilk{
    @Override
    void addCondiment() {
        System.out.println("加入上好的红豆");
    }
}

3. PeantSoyaMilk

package java设计模式.Template;

public class PeantSoyaMilk extends SoyaMilk{
    @Override
    void addCondiment() {
        System.out.println("加入上好的花生");
    }
}

4.测试

package java设计模式.Template;

public class Client {
    public static void main(String[] args) {
        System.out.println("=======制作红豆豆浆=======");
       SoyaMilk redBeanSoyaMilk = new RedBeanSoyaMilk();
       redBeanSoyaMilk.make();
        System.out.println("=======制作花生豆浆=======");
        SoyaMilk peanutSoyaMilk = new PeantSoyaMilk();
        peanutSoyaMilk.make();
    }
}

image.png

3.模板方法模式的钩子方法

在模板方法模式的父类中,可以定义一个方法,它默认不做任何事,子类可以视情况要不要覆盖它,该方法称为“钩子”。还是用上面做豆浆的例子来讲解,比如,我们还希望制作纯豆浆,不添加任何的配料,请使用钩子方法对前面的模板方法进行改造。代码实现如下:

package java设计模式.Template.improve;
// 抽象类,表示豆浆 SoyaMilk.java
public abstract class SoyaMilk {
    // 模板方法:可以做成final,不让子类去覆盖
    final void make(){
        select();
        if(customerWantCondiment()) {
            addCondiment();
        }

        soak();
        beat();

    }
    //选材料
    void select() { System.out.println("第一步:选择新鲜的豆子"); }
    //添加不同的配料:抽象方法,由子类具体实现
    abstract void addCondiment();
    //浸泡
    void soak() { System.out.println("第三步:豆子和配料开始浸泡3H"); }
    //榨汁
    void beat() { System.out.println("第四步:豆子和配料放入豆浆机榨汁"); }
    //钩子方法:决定是否需要添加配料
    boolean customerWantCondiment() {
        return true;//默认情况下是要加配料的
    }

}
package java设计模式.Template.improve;

public class PeantSoyaMilk extends SoyaMilk {
    @Override
    void addCondiment() {
        System.out.println("加入上好的花生");
    }
}
package java设计模式.Template.improve;

public class PureSoyaMilk extends SoyaMilk{
    @Override
    void addCondiment() {
        // 添加配料的方法 空实现 即可
    }
    @Override
    boolean customerWantCondiment() {
        return false;
    }
}
package java设计模式.Template.improve;

public class RedBeanSoyaMilk extends SoyaMilk {
    @Override
    void addCondiment() {
        System.out.println("加入上好的红豆");
    }
}
package java设计模式.Template.improve;

public class Client {
    public static void main(String[] args) {
        System.out.println("=======制作红豆豆浆=======");
       SoyaMilk redBeanSoyaMilk = new RedBeanSoyaMilk();
       redBeanSoyaMilk.make();
        System.out.println("=======制作花生豆浆=======");
        SoyaMilk peanutSoyaMilk = new PeantSoyaMilk();
        peanutSoyaMilk.make();
        System.out.println("=制作纯豆浆=");
        SoyaMilk pureSoyMilk = new PureSoyaMilk();
        pureSoyMilk.make();
    }
}

image.png

四、注意事项和细节

基本思想是:算法只存在于一个地方,也就是在父类中,容易修改。需要修改算法时,只要修改父类的模板方法或者已经实现的某些步骤,子类就会继承这些修改


好处:

实现了最大化代码复用。父类的模板方法和已实现的某些步骤会被子类继承而直接使用;
既统一了算法,也提供了很大的灵活性。父类的模板方法确保了算法的结构保持不变,同时由子类提供部分步骤的实现

该模式的不足之处:每一个不同的实现都需要一个子类实现,导致类的个数增加,使得系统更加庞大

注意:一般模板方法都加上 final 关键字, 防止子类重写模板方法

模板方法模式使用场景:

当要完成在某个过程,该过程要执行一系列步骤 ,这一系列的步骤基本相同,但其个别步骤在实现时可能不同,通常考虑用模板方法模式来处理

统计某一段代码的执行时间也可以用模板方法模式:在前面打印出代码执行前的时间,后面再打印出代码执行后的时间,中间部分就是不同的执行代码


相关实践学习
基于MaxCompute的热门话题分析
Apsara Clouder大数据专项技能认证配套课程:基于MaxCompute的热门话题分析
相关文章
|
2月前
|
设计模式 Java Spring
Java 设计模式之责任链模式:优雅处理请求的艺术
责任链模式通过构建处理者链,使请求沿链传递直至被处理,实现发送者与接收者的解耦。适用于审批流程、日志处理等多级处理场景,提升系统灵活性与可扩展性。
294 2
|
2月前
|
设计模式 网络协议 数据可视化
Java 设计模式之状态模式:让对象的行为随状态优雅变化
状态模式通过封装对象的状态,使行为随状态变化而改变。以订单为例,将待支付、已支付等状态独立成类,消除冗长条件判断,提升代码可维护性与扩展性,适用于状态多、转换复杂的场景。
331 0
|
4月前
|
设计模式 缓存 Java
Java设计模式(二):观察者模式与装饰器模式
本文深入讲解观察者模式与装饰器模式的核心概念及实现方式,涵盖从基础理论到实战应用的全面内容。观察者模式实现对象间松耦合通信,适用于事件通知机制;装饰器模式通过组合方式动态扩展对象功能,避免子类爆炸。文章通过Java示例展示两者在GUI、IO流、Web中间件等场景的应用,并提供常见陷阱与面试高频问题解析,助你写出灵活、可维护的代码。
|
2月前
|
设计模式 算法 搜索推荐
Java 设计模式之策略模式:灵活切换算法的艺术
策略模式通过封装不同算法并实现灵活切换,将算法与使用解耦。以支付为例,微信、支付宝等支付方式作为独立策略,购物车根据选择调用对应支付逻辑,提升代码可维护性与扩展性,避免冗长条件判断,符合开闭原则。
373 35
|
2月前
|
设计模式 消息中间件 传感器
Java 设计模式之观察者模式:构建松耦合的事件响应系统
观察者模式是Java中常用的行为型设计模式,用于构建松耦合的事件响应系统。当一个对象状态改变时,所有依赖它的观察者将自动收到通知并更新。该模式通过抽象耦合实现发布-订阅机制,广泛应用于GUI事件处理、消息通知、数据监控等场景,具有良好的可扩展性和维护性。
289 8
|
7月前
|
设计模式 缓存 安全
【高薪程序员必看】万字长文拆解Java并发编程!(8):设计模式-享元模式设计指南
🌟 ​大家好,我是摘星!​ 🌟今天为大家带来的是并发编程中的经典对象复用设计模式-享元模式,废话不多说让我们直接开始。
175 0
|
4月前
|
设计模式 安全 Java
Java设计模式(一):单例模式与工厂模式
本文详解单例模式与工厂模式的核心实现及应用,涵盖饿汉式、懒汉式、双重检查锁、工厂方法、抽象工厂等设计模式,并结合数据库连接池与支付系统实战案例,助你掌握设计模式精髓,提升代码专业性与可维护性。
|
4月前
|
设计模式 XML 安全
Java枚举(Enum)与设计模式应用
Java枚举不仅是类型安全的常量,还具备面向对象能力,可添加属性与方法,实现接口。通过枚举能优雅实现单例、策略、状态等设计模式,具备线程安全、序列化安全等特性,是编写高效、安全代码的利器。
|
7月前
|
设计模式 数据采集 算法
【设计模式】【行为型模式】模板方法模式(Template Method)
一、入门 1.1、什么是模板方法模式? 模板模式(Template Method Pattern)是一种行为设计模式,它定义了一个算法的框架,并允许子类在不改变算法结构的情况下重新定义算法的某些步骤。
244 13
|
10月前
|
设计模式 SQL 算法
「全网最细 + 实战源码案例」设计模式——模板方法模式
模板方法模式是一种行为型设计模式,定义了算法的骨架并在父类中实现不变部分,将可变部分延迟到子类实现。通过这种方式,它避免了代码重复,提高了复用性和扩展性。具体步骤由抽象类定义,子类实现特定逻辑。适用于框架设计、工作流和相似算法结构的场景。优点包括代码复用和符合开闭原则,缺点是可能违反里氏替换原则且灵活性较低。
254 7
「全网最细 + 实战源码案例」设计模式——模板方法模式