核心模块:AbstractClass抽象类、ConcreteClass具体类
所有代码请访问:git@code.aliyun.com:289804201/PatternLearn.git
目的:提供一个算法框架,使得相同的算法框架可以有不同的执行结果:
使用场景:对复杂的算法进行分割,不变的部分保存到父类中,细节改变由子类来实现;
优点:代码复用,符合opc开放封闭原则,行为可扩展,控制子类的扩展;
缺点:如果子类太多,导致类的个数增加,系统变得庞大;
注意:为了防止子类改变算法的实现步骤,我们可以将模板方法的申明为final;
代码实例:
public class TemplateMethodPattern {
public static void main(String[] args) {
HotCoffee coffee = new HotCoffee();
coffee.getHotDrinks();
System.out.println();
HotTea tea1 = new HotTea(){
@Override
public boolean customerNeedCondiments() {
return false;
}
};
tea1.getHotDrinks();
System.out.println();
HotTea tea2 = new HotTea();
tea2.getHotDrinks();
System.out.println();
}
}
//Abstract算法抽象类
abstract class absHotDrinks {
//烧水
private void boilWater() {
System.out.println("boilWater()...");
}
//冲调料
protected abstract void brew();
//倒入被子
private void putInCup() {
System.out.println("putInCup()...");
}
//加调料
protected abstract void addCondiments();
//钩子,控制父类,用户是否要加调料
public boolean customerNeedCondiments() {
return true;
}
//具体算法放放,防止子类改变算法步骤
public final void getHotDrinks() {
boilWater();
brew();
putInCup();
if (customerNeedCondiments()) {
addCondiments();
}
}
}
class HotCoffee extends absHotDrinks{
@Override
protected void brew() {
System.out.println("now add coffee...");
}
@Override
protected void addCondiments() {
System.out.println("now coffee add milk and sugar...");
}
}
class HotTea extends absHotDrinks{
@Override
protected void brew() {
System.out.println("now add tea...");
}
@Override
protected void addCondiments() {
System.out.println("now tea add sugar...");
}
}
内容打印
Hello World!
boilWater()...
now add coffee...
putInCup()...
now coffee add milk and sugar...
boilWater()...
now add tea...
putInCup()...
boilWater()...
now add tea...
putInCup()...
now tea add sugar...