【设计模式-4.4】行为型——模板方法模式

说明:本文介绍设计模式中行为型设计模式中的,模板方法模式;

生存

模版方法模式是行为型设计模式,关注于对象的行为。在《秒懂设计模式》(刘韬 著)中举了一个例子,例如哺乳动物的生存技能,鲸鱼、人类都属于哺乳动物,有吃、动的行为,并依靠这两项行为生存。代码如下:

(Whale,鲸鱼)

java 复制代码
/**
 * 鲸鱼类
 */
public class Whale {

    /**
     * 鲸鱼的活动
     */
    public void move(){
        System.out.println("鲸鱼在游泳");
    }

    /**
     * 鲸鱼的吃
     */
    public void eat() {
        System.out.println("鲸鱼捕食海洋中的小鱼");
    }

    /**
     * 鲸鱼的生存
     */
    public void life() {
        move();
        eat();
    }
}

(Human,人类)

java 复制代码
/**
 * 人类
 */
public class Human {

    /**
     * 人类的活动
     */
    public void move(){
        System.out.println("人类在走路");
    }

    /**
     * 人类的吃
     */
    public void eat() {
        System.out.println("人类吃饭");
    }

    /**
     * 人类的生存
     */
    public void life() {
        move();
        eat();
    }
}

(Client,客户端,模拟流程)

java 复制代码
/**
 * 客户端
 */
public class Client {
    public static void main(String[] args) {
        new Whale().life();
        System.out.println("===========");
        new Human().life();
    }
}

(执行程序)

模板方式模式

分析上面的代码,可以看到,鲸鱼、人类生存行为都是依赖于吃、动行为的,是模板化的。所以,可以考虑抽取出一个哺乳动物抽象类,类中有吃、动抽象方法,而对于生存行为,则将其模板化,固定搭配,写在一个final修饰的生存方法中。如下:

(Mammal,哺乳动物抽象类,固定生存模板方法)

java 复制代码
/**
 * 哺乳动物类
 */
public abstract class Mammal {

    /**
     * 哺乳动物的活动
     */
    public abstract void move();
    
    /**
     * 哺乳动物的吃
     */
    public abstract void eat();
    
    /**
     * 哺乳动物的生存
     */
    public final void life() {
        move();
        eat();
    }
}

(Whale,鲸鱼,具体实现类)

java 复制代码
/**
 * 鲸鱼类
 */
public class Whale extends Mammal{

    /**
     * 鲸鱼的活动
     */
    public void move(){
        System.out.println("鲸鱼在游泳");
    }

    /**
     * 鲸鱼的吃
     */
    public void eat() {
        System.out.println("鲸鱼捕食海洋中的小鱼");
    }
}

(Human,人类,具体实现类)

java 复制代码
/**
 * 人类
 */
public class Human extends Mammal{

    /**
     * 人类的活动
     */
    public void move(){
        System.out.println("人类在走路");
    }

    /**
     * 人类的吃
     */
    public void eat() {
        System.out.println("人类吃饭");
    }
}

(Client,客户端,模拟流程)

java 复制代码
/**
 * 客户端
 */
public class Client {
    public static void main(String[] args) {
        new Whale().life();
        System.out.println("===========");
        new Human().life();
    }
}

通过模板方法模式,将多个对象中行为的固定组合,从对象中抽取出来放到父类中,简化了代码,同时也统一了子类的方法。

总结

本文参考《设计模式的艺术》、《秒懂设计模式》两书,案例代码与书中的略有不同。

相关推荐
从琳开始98912 分钟前
[JavaEE]多线程初阶(下篇)------多线程案例(单例模式,阻塞队列,线程池,定时器)
java·单例模式·java-ee
乌暮16 分钟前
# Spring 入门与 Spring MVC 实战指南:从零理解 IoC 到 RESTful 图书管理
java·开发语言·后端·学习·spring·mvc·restful
java1234_小锋18 分钟前
Spring Boot 4.0 官宣:弃用 Undertow
java·spring boot·后端
jyOverQ21 分钟前
Redis 主从复制、Sentinel 和 Cluster 到底有什么区别?
java·redis·sentinel
青春逝如流水33 分钟前
Java 线程在内存模型(JMM)与 JVM 实现:规范与落地的多元路径
java·开发语言·jvm·多线程·ai文章
wangbing11252 小时前
springboot应用关闭时触发动作
java·spring boot·后端
weixin_460443565 小时前
2026年新修订《网络安全法》实施:Java私有化考试系统如何做好SBOM、漏洞治理与安全升级?
java·开发语言·在线考试系统·企业培训考试系统·宏远培训考试系统·国企培训考试系统·国产化培训系统
海鸥-w8 小时前
什么是AOP
java
Cc.Y9 小时前
Java零基础入门:可变字符串与包装类:StringBuilder、StringBuffer 与 通讯录管理系统实战
java·开发语言·python
paopaokaka_luck9 小时前
基于springboot+vue的智慧家政管理系统(AI问答、 WebSocket实时沟通、ECharts运营分析、订单规则与服务追踪)
java·javascript·spring boot·数据分析·echarts·mybatis