模板方法模式(Template Method Pattern)

模板方法模式

说明

模板方法模式(Template Method Pattern)通常又叫模板模式,是指定义一个操作中算法的骨架,将一些步骤延迟到子类中。模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。
在某些业务场景中,一些类的方法中可能存在大量重复的代码,这些代码的执行步骤大体也是相同的,只有某些细节的实现可能不同。这时使用模板方法将重复的代码及其执行步骤抽象到一个类中,来实现代码的复用,对于不同的实现细节则由子类去实现,模板方法本质就是利用了继承与多态。

结构

模板方法模式的主要角色如下:
抽象模板(AbstractClass):定义算法的骨架;
具体实现(ConcreteClass):继承AbstractClass,对某些细节步骤进行实现。
模板方法模式

代码案例

反例

/**
 * @program: template
 * @description: 男性
 * @author: wxw
 * @create: 2024-03-08 15:55
 **/
public class Man {

    private String name;

    public Man(String name) {
        this.name = name;
    }

    public void fitness(){
        System.out.println(this.name + "准备健身");
        System.out.println("换上运动装备:运动背心、运动鞋、大裤衩子");
        System.out.println("热身:跑步机");
        System.out.println("正式训练:力量训练");
        System.out.println("训练结束:泡沫轴放松");
        System.out.println("回家!");
    }
}

/**
 * @program: template
 * @description: 女性
 * @author: wxw
 * @create: 2024-03-08 15:56
 **/
public class Woman {

    private String name;

    public Woman(String name) {
        this.name = name;
    }

    public void fitness(){
        System.out.println(this.name + "准备健身");
        System.out.println("换上运动装备:运动背心、运动鞋、瑜伽裤");
        System.out.println("热身:椭圆机");
        System.out.println("正式训练:瑜伽");
        System.out.println("训练结束:拉伸");
        System.out.println("回家!");
    }
}

/**
 * @program: template
 * @description: test
 * @author: wxw
 * @create: 2024-03-08 16:02
 **/
public class Test {

    public static void main(String[] args) {
        Man man = new Man("张三");
        man.fitness();
        System.out.println("======================");
        Woman woman = new Woman("小梅");
        woman.fitness();
    }
}

两个类中存在大量重复代码:
在这里插入图片描述
模板方法解决

/**
 * @program: template
 * @description: 健身模板类
 * @author: wxw
 * @create: 2024-03-08 16:04
 **/
public abstract class FitnessTempalte {

    protected String name;

    public void fitness(){
        System.out.println(this.name + "准备健身");
        System.out.println("换上运动装备:" + setSportsEquipment());
        System.out.println("热身:" + setWarmUp());
        System.out.println("正式训练:" + setTrainingMode());
        System.out.println("训练结束:" + setRelax());
        System.out.println("回家!");
    }

    /**
     * 设置运动装备
     * @return
     */
    public abstract String setSportsEquipment();

    /**
     * 设置热身方式
     * @return
     */
    public abstract String setWarmUp();

    /**
     * 设置训练方式
     * @return
     */
    public abstract String setTrainingMode();

    /**
     * 设置放松方式
     * @return
     */
    public abstract String setRelax();

}

/**
 * @program: template
 * @description: 男性
 * @author: wxw
 * @create: 2024-03-08 15:55
 **/
public class Man extends FitnessTempalte {

    public Man(String name) {
        this.name = name;
    }

    @Override
    public String setSportsEquipment() {
        return "运动背心、运动鞋、大裤衩子";
    }

    @Override
    public String setWarmUp() {
        return "跑步机";
    }

    @Override
    public String setTrainingMode() {
        return "力量训练";
    }

    @Override
    public String setRelax() {
        return "泡沫轴放松";
    }
}

/**
 * @program: template
 * @description: 女性
 * @author: wxw
 * @create: 2024-03-08 15:56
 **/
public class Woman extends FitnessTempalte {

    public Woman(String name) {
        this.name = name;
    }

    @Override
    public String setSportsEquipment() {
        return "运动背心、运动鞋、瑜伽裤";
    }

    @Override
    public String setWarmUp() {
        return "椭圆机";
    }

    @Override
    public String setTrainingMode() {
        return "瑜伽";
    }

    @Override
    public String setRelax() {
        return "拉伸";
    }
}

public class Test {

    public static void main(String[] args) {
        Man man = new Man("张三");
        man.fitness();
        System.out.println("======================");
        Woman woman = new Woman("小梅");
        woman.fitness();
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值