前言
在模板模式(Template Pattern)中,一个抽象类公开定义了执行它的方法的方式/模板。它的子类可以按需要重写方法实现,但调用将以抽象类中定义的方式进行。这种类型的设计模式属于行为型模式。
1、模板方法模式
1.1 用途
定义一个模板结构,将具体内容延迟到子类去实现,在不改变模板结构的前提下在子类中重新定义模板中的内容。
1.2 UML
1.3 示例
本章以跟跟女生约会为例,讲述下模板方法模式。
主要包括一下四步:
- 加微信聊天
- 约女生吃饭
- 表白
- 送对方回家
步骤可能不大合理,毕竟楼主也是loser -_-!,说明个大致意思就行。
AbstractDating
/**
* @author jhz
* @date 18-11-11 下午9:59
*/
public abstract class AbstractDating {
//抽象模板,用于定义约会流程
final void date(){
this.Chatting();
this.haveDinner();
this.ExpressingLove();
this.walkBack();
}
void Chatting(){
System.out.println("先加个微信聊天 ---");
}
void haveDinner(){
System.out.println("约对方吃饭---");
}
abstract void ExpressingLove();
void walkBack(){
System.out.println("送对方回家---");
}
}
ConcreteDatingWithFlower
/**
* @author jhz
* @date 18-11-11 下午10:09
*/
public class ConcreteDatingWithFlower extends AbstractDating {
@Override
void ExpressingLove() {
System.out.println("送花表白---");
}
}
ConcreteDatingWithDiamond
/**
* @author jhz
* @date 18-11-11 下午10:11
*/
public class ConcreteDatingWithDiamond extends AbstractDating {
@Override
void ExpressingLove() {
System.out.println("送钻戒表白---");
}
}
Client
/**
* @author jhz
* @date 18-11-11 下午10:12
*/
public class Client {
public static void main(String[] args) {
//送花表白
ConcreteDatingWithFlower person1 = new ConcreteDatingWithFlower();
person1.date();
//送钻戒表白
ConcreteDatingWithDiamond person2 = new ConcreteDatingWithDiamond();
person2.date();
}
}
测试结果
2、优缺点
接下来来介绍模板方法模式的优缺点。
2.1 优点
- 提高代码复用性
将相同部分的代码放在抽象的父类中 - 提高了拓展性
将不同的代码放入不同的子类中,通过对子类的扩展增加新的行为 - 实现了反向控制
通过一个父类调用其子类的操作,通过对子类的扩展增加新的行为,实现了反向控制 & 符合“开闭原则”
2.2 缺点
引入了抽象类,每一个不同的实现都需要一个子类来实现,导致类的个数增加,从而增加了系统实现的复杂度。
3、总结
模板方法模式可以用于实现包含固定和可变成分的类,用于定义类的行为,通过将公共行为提取到父类中,可以提高代码复用率,同时也能控制子类的扩展,正如示例中的约会过程,虽然示例略挫,但是跟女生聊天吃饭,吃完饭送女生回家总是必要的,而表白的部分则可以由子类自由发挥了,个人有个人不同的表达爱的方式,会撩妹的可以买钻戒,低情商的楼主只能买束花了,坚信真心总会遇到能够互相理解的人,这里有点跑题:-D,总之,通过模板方法可以在不改变模板结构的前提下在子类中重新定义模板中的内容。