本篇文章介绍行为型模式中的模版方法模式,这个设计模式相对来说好理解一些,因为你可能在平时的开发中不自觉的使用到了它。在平常的开发中也许会遇到抽象类控制算法步骤,但某些方法需要延迟到子类中实现,这时候就需要模版方法模式。
模版方法模式
在一个方法中定义了一个算法的骨架,而将一些步骤延迟到子类中。模版方法使得子类在可以不改变算法结构的情况下,重新定义算法中的某些步骤。
假设我们有个Person抽象类,包含出生、上学、工作、娶妻和生子五个方法,对每个人来说出生和生子是一样的,但上学,工作和娶妻各有各的不同(有点强行,这意思明白就好......)。在这个场景中,必须由Person来控制算法的顺序(总得娶妻才能生子吧),但有些必须由子类实现,因此我们用模版方法设计模式来实现。
类图
具体实现
Person抽象类:
abstract class Person{
//控制算法顺序
public final void live(){
this.beBorn();
this.goToSchool();
this.work();
this.takeAWife();
this.born();
}
//出生
protected void beBorn(){
System.out.println("我出生啦...");
}
//上学
abstract void goToSchool();
//工作
abstract void work();
//娶妻
abstract void takeAWife();
//生子
protected void born(){
System.out.println("我生孩子啦...");
}
}
具体实现类:
class Blogger extends Person{
@Override
void goToSchool() {
System.out.println("我上的隔壁村的小学...");
}
@Override
void work() {
System.out.println("我享受的是996福报...");
}
@Override
void takeAWife() {
System.out.println("我还没娶媳妇呢,如果生孩子了就勉强算未婚先孕吧...");
}
}
class SiCong extends Person{
@Override
void goToSchool() {
System.out.println("我上的新加坡Swiss Cottage的小学...");
}
@Override
void work() {
System.out.println("我拿5个亿随便投投资...");
}
@Override
void takeAWife() {
System.out.println("我还没娶但我的女朋友们不是网红就是明星...");
}
}
测试程序及输出结果:
测试程序:
public static void main(String[] args) {
Blogger blogger = new Blogger();
blogger.live();
System.out.println();
SiCong siCong = new SiCong();
siCong.live();
}
输出结果:
我出生啦...
我上的隔壁村的小学...
我享受的是996福报...
我还没娶媳妇呢,如果生孩子了就勉强算未婚先孕吧...
我生孩子啦...
我出生啦...
我上的新加坡Swiss Cottage的小学...
我拿5个亿随便投投资...
我还没娶但我的女朋友们不是网红就是明星...
我生孩子啦...
在抽象类中控制算法顺序的方法是final的,目的是防止子类重写这个方法,不然也就失去了这个方法的目的。