场景引入:
我国古代的四大发明中的印刷术,就会用到一个称作模板的东西,事先将需要的东西进行雕刻成模子,然后按需使用。
模板方法模式将公共部分则加以实现,不定的方法定义在父类中,并且是抽象方法,而具体怎样去完成则交给子类去实现。不同的子类中进行不同的具体处理,父类模板方法调用时其行为也会有所不同,但无论怎样,其都会按照父类指定的流程去执行。
能解决的问题:
提高代码复用性,将相同部分放入抽象的父类,不同的则通过子类扩展,实现反向控制,通过父类调用子类的操作,通过对子类的具体实现扩展不同的行为,实现反向控制。
现在用一个例子来实现末班方法模式
场景:我们过传统节日,南方人和北方人以吃什么来庆祝,南方人吃汤圆,北方人吃饺子。但是节日都是一样的,因此节日祝福都是一样的,吃的东西有区别。
场景有了,我们用一个代码来表示:
首先需要一个抽象类来作为模板:
场景中节日祝福肯定是一样的,因为过的都是同一个节日,因此我们直接在模板方法中实现,而吃什么的习俗则根据南北差异会有所区别,则暴露出抽象方法交给子类进行发挥。
public abstract class Festival {
public void festivaling() {
festivalWord();
festivalFood();
}
public void festivalWord(){
System.out.println("**节快乐");
}
public abstract void festivalFood();
}
给出了模板,接下来我们根据南北差异,进行实现,南方人吃汤圆
public class SouthFestival extend Festival {
@Override
public void festivalFood() {
System.out.println("吃汤圆");
}
}
北方人吃饺子
public class NorthFestival extend Festival {
@Override
public void festivalFood() {
System.out.println("吃饺子");
}
}
给出测试类
public class Main{
public static void main(String[] args){
Festival fSouth = new SouthFestival();
Festival fNorth = new NorthFestival();
fSouth.festivaling();
System.out.println("-----------我是南北方分割线--------");
fNorth.festivaling();
}
}
测试的结果可想而知了:
**节快乐
吃汤圆
-----------我是南北方分割线--------
**节快乐
吃饺子
因此,模板方法介绍结束!
适用场景
实现业务的不变部分,并将可变的行为留给子类来实现;各子类中公共的行为应被提取出来并集中到一个公共父类中以避免代码重复;控制子类的扩展。
有一个缺点就是,引入抽象类,并且在不同的需求,都需要扩展子类实现,会增加整体复杂性。