设计模式--行为型模式
行为型模式
模板模式
在含有继承结构的代码中,模板方法模式是非常常用的。用一个统一的父类实现定义所有的方法和接口。不同的子类来完成自己具体的实现。
父类定义了骨架(调用哪些方法及顺序),某些特定方法由子类实现
模板方法只负责定义第一步应该要做什么,第二步应该做什么,第三步应该做什么,至于怎么做,由子类来实现。
好处:代码复用,减少重复代码。除了子类要实现的特定方法,其他方法及方法调用顺序都在父类中预先写好
缺点: 每一个不同的实现都需要一个子类来实现,导致类个数增加,使系统更加庞大
模板模式的关键点:
1、使用抽象类定义模板类,并在其中定义所有的基本方法、模板方法,钩子方法,不限数量,以实现功能逻辑为主。其中基本方法使用final修饰,其中要调用基本方法和钩子方法,基本方法和钩子方法可以使用protected修饰,表明可被子类修改。
2、定义实现抽象类的子类,重写其中的模板方法,甚至钩子方法,完善具体的逻辑。
使用场景:
1、在多个子类中拥有相同的方法,而且逻辑相同时,可以将这些方法抽出来放到一个模板抽象类中。
2、程序主框架相同,细节不同的情况下,也可以使用模板方法。
架构方法介绍
模板方法使得子类可以在不改变算法结构的情况下,重新定义算法中的某些步骤。其主要分为两大类:模版方法和基本方法,而基本方法又分为:抽象方法(Abstract Method),具体方法(Concrete Method),钩子方法(Hook Method)。
四种方法的基本定义(前提:在抽象类中定义):
(1)抽象方法:由抽象类声明,由具体子类实现,并以abstract关键字进行标识。
(2)具体方法:由抽象类声明并且实现,子类并不实现或者做覆盖操作。其实质就是普遍适用的方法,不需要子类来实现。
(3)钩子方法:由抽象类声明并且实现,子类也可以选择加以扩展。通常抽象类会给出一个空的钩子方法,也就是没有实现的扩展。它和具体方法在代码上没有区别,不过是一种意识的区别;而它和抽象方法有时候也是没有区别的,就是在子类都需要将其实现的时候。而不同的是抽象方法必须实现,而钩子方法可以不实现。也就是说钩子方法为你在实现某一个抽象类的时候提供了可选项,相当于预先提供了一个默认配置。
(4)模板方法:定义了一个方法,其中定义了整个逻辑的基本骨架。
public abstract class AbstractTemplate {
// 这就是模板方法
public void templateMethod() {
init();
apply(); // 这个是重点
end(); // 可以作为钩子方法
}
//这是具体方法
protected void init() {
System.out.println("init 抽象层已经实现,子类也可以选择覆写");
}
// 这是抽象方法,留给子类实现
protected abstract void apply();
//这是钩子方法,可定义一个默认操作,或者为空
protected void end() {
}
}