设计模式(十二)行为型模式---模板方法模式
文章目录
- 模板方法模式
- 结构
- 优缺点
- 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{@Overridepublic void addVegetable() {System.out.println("添加肉");}@Overridepublic void addSauce() {}
}
package com.xxliao.pattern.behavioral.template_method.demo;/*** @author xxliao* @description: 具体类* @date 2024/5/25 18:12*/
public class CookCabbage extends CookAbstractCalss{@Overridepublic void addVegetable() {System.out.println("添加包菜");}@Overridepublic void addSauce() {}/*** @description 重写钩子方法* @author xxliao* @date 2024/5/25 18:13*/@Overridepublic 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();}
}
- 测试结果