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