模板方法模式(Template Method)
Posted 人生如逆旅,我亦是行人。
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了模板方法模式(Template Method)相关的知识,希望对你有一定的参考价值。
定义:
定义一个模板结构,将具体内容延迟到子类去实现。
解决的问题:
- 提高代码复用性。将相同部分的代码放在抽象的父类中,而将不同的代码放入不同的子类中
- 实现了反向控制。通过一个父类调用其子类的操作,通过对子类的具体实现扩展不同的行为,实现了反向控制 & 符合“开闭原则”
uml类图:
模式组成:
- AbstractClass:抽象类。实现了模板方法,定义了算法的骨架
- ConcreteClass:具体类。实现抽象类中的抽象方法,已完成完整的算法
优点:
- 提高代码复用性
将相同部分的代码放在抽象的父类中
- 提高了拓展性
将不同的代码放入不同的子类中,通过对子类的扩展增加新的行为
- 实现了反向控制
通过一个父类调用其子类的操作,通过对子类的扩展增加新的行为,实现了反向控制 & 符合“开闭原则”
缺点:
- 引入了抽象类,每一个不同的实现都需要一个子类来实现,导致类的个数增加,从而增加了系统实现的复杂度
举个栗子:
定义抽象角色
abstract class AbstractPerson { public void prepareGotoSchool() { dressup(); eatBreakfast(); takeThings(); } void dressup() { System.out.println("穿衣洗漱"); } protected abstract void eatBreakfast(); protected abstract void takeThings(); }
定义具体实现
class Student extends AbstractPerson { @Override protected void eatBreakfast() { System.out.println("吃妈妈做好的早餐"); } @Override protected void takeThings() { System.out.println("背书包,带好作业去学校"); } }
定义具体实现
class Teacher extends AbstractPerson { @Override protected void eatBreakfast() { System.out.println("做早饭,并照顾孩子吃早饭"); } @Override protected void takeThings() { System.out.println("带上昨晚准备的试卷"); } }
客户端调用
public static void main(String[] args) { Student s = new Student(); Teacher t = new Teacher(); s.prepareGotoSchool(); System.out.println("============="); t.prepareGotoSchool(); }
输出
以上是关于模板方法模式(Template Method)的主要内容,如果未能解决你的问题,请参考以下文章
GOF23设计模式之模板方法模式(template method)
设计模式系列13:模板方法模式(Template Method Pattern)