文章目录
- 模板方法模式
- 结构
- 优缺点
- UML图
- 具体实现
- UML图
- 代码实现
模板方法模式
- 模板方法模式(Template Method)是一种基于继承实现的设计模式,主要思想是:将定义的算法抽象成一组步骤,在抽象类中定义算法的骨架,把具体实现留给子类来实现。
- 实际使用: JDBCTemplate,HttpServlet,Servlet过滤器。
结构
- 抽象类(Abstract):定义了算法骨架,包含了一个或者多个抽象方法,这些方法由子类来具体实现。抽象类中通常还包含一个模板方法,用来调用抽象方法和具体方法,控制算法执行的顺序。抽象类中还可以定义钩子方法,用于控制模板方法中的条件控制。
- 具体类(Concrete Class):继承抽象类,实现抽象方法。
优缺点
- 优点:提高代码复用性,符合开闭原则,提高代码可维护性。
- 缺点:每一个不同的实现都需要一个子类来解决。
UML图
具体实现
例子:炒菜需要放油、放肉、放菜,使用模板方法实现。
UML图
代码实现
- 具体类
package com.xxliao.pattern.behavioral.template_method.demo;
/**
* @author xxliao
* @description: 具体类
* @date 2024/5/25 18:12
*/
public class CookMeat extends CookAbstractCalss{
@Override
public void addVegetable() {
System.out.println("添加肉");
}
@Override
public void addSauce() {}
}
package com.xxliao.pattern.behavioral.template_method.demo;
/**
* @author xxliao
* @description: 具体类
* @date 2024/5/25 18:12
*/
public class CookCabbage extends CookAbstractCalss{
@Override
public void addVegetable() {
System.out.println("添加包菜");
}
@Override
public void addSauce() {}
/**
* @description 重写钩子方法
* @author xxliao
* @date 2024/5/25 18:13
*/
@Override
public boolean isAddOil() {
return false;
}
}
- 抽象类
package com.xxliao.pattern.behavioral.template_method.demo;
/**
* @author xxliao
* @description: 抽象类 -
* @date 2024/5/25 18:03
*/
public abstract class CookAbstractCalss {
/**
* @description 模板方法
* @author xxliao
* @date 2024/5/25 18:08
*/
public final void cook() {
if(isAddOil()) {
this.pourOil();
}
this.heatOil();
this.addVegetable();
this.addSauce();
this.fry();
}
// 具体方法
public void pourOil() {
System.out.println("倒油");
}
// 具体方法
public void heatOil() {
System.out.println("加热");
}
/**
* @description 抽象方法,让子类实现
* @author xxliao
* @date 2024/5/25 18:05
*/
public abstract void addVegetable();
/**
* @description 抽象方法,让子类实现
* @author xxliao
* @date 2024/5/25 18:06
*/
public abstract void addSauce();
// 具体方法
public void fry() {
System.out.println("翻炒");
}
/**
* @description 钩子方法
* @author xxliao
* @date 2024/5/25 18:10
*/
public boolean isAddOil() {
return true;
}
}
- 测试客户端
package com.xxliao.pattern.behavioral.template_method.demo;
/**
* @author xxliao
* @description: 模板方法模式 测试客户端
* @date 2024/5/25 18:16
*/
public class Client {
public static void main(String[] args) {
CookCabbage cookBaocai = new CookCabbage();
cookBaocai.cook();
System.out.println("===========================================");
CookMeat cookMeat = new CookMeat();
cookMeat.cook();
}
}
- 测试结果