定义:
定义一个操作中算法的骨架,而将一些步骤延迟到子类中,模板方法使得子类可以不改变算法的结构即可重定义该算法的某些特定步骤。
通俗点的理解就是 :完成一件事情,有固定的数个步骤,但是每个步骤根据对象的不同,而实现细节不同;就可以在父类中定义一个完成该事情的总方法,按照完成事件需要的步骤去调用其每个步骤的实现方法。每个步骤的具体实现,由子类完成。
用意:
准备一个抽象类,将部分逻辑以具体的方法实现,然后声明一些抽象方法交由子类实现剩余逻辑,用钩子方法给与子类更大的灵活性。最后,将方法汇总成一个不可改变的模版方法。
角色:
抽象类(AbstractClass):实现了模板方法,定义了算法的骨架。
具体类(ConcreteClass):实现抽象类中的抽象方法,已完成完整的算法。
适用场景:
在某些类的算法中,用了相同的方法,造成代码的重复。
控制子类扩展,子类必须遵守算法规则。
有多个子类共有的方法,且逻辑相同。
重要的、复杂的方法,可以考虑作为模板方法。
优点:
封装不变部分,扩展可变部分。
提取公共代码,便于维护。
行为由父类控制,子类实现。
缺点:
每一个不同的实现都需要一个子类来实现,导致类的个数增加,使得系统更加庞大。
package template;
/*
* 模板模式
*/
public abstract class DodishTemplate {
public abstract void ready();//准备
public abstract void cook();//做菜
public abstract void serving();//上菜
public void cooking(){
this.ready();
this.cook();
this.serving();
}
}
package template;
/*
* 模板模式
*/
public class RadishVeal extends DodishTemplate{
@Override
public void ready() {
System.out.println("准备牛肉、萝卜、和配料");
}
@Override
public void cook() {
System.out.println("将牛肉炖七分熟,倒入萝卜");
}
@Override
public void serving() {
System.out.println("摆盘,上菜");
}
}
package template;
/*
* 模板模式
*/
public class HalogenChickenFeet extends DodishTemplate{
@Override
public void ready() {
System.out.println("新鲜的鸡爪、卤水和香料");
}
@Override
public void cook() {
System.out.println("一起下锅慢炖,直到入味");
}
@Override
public void serving() {
System.out.println("摆盘,上菜");
}
}
package template;
/*
* 模板模式
*/
public class Dodish {
public static void main(String[] args) {
DodishTemplate dodishTemplate = new RadishVeal();
dodishTemplate.ready();
dodishTemplate.cook();
dodishTemplate.serving();
DodishTemplate doTemplate = new HalogenChickenFeet();
doTemplate.ready();
doTemplate.cook();
doTemplate.serving();
}
}
请关注“知了堂学习社区”,地址:http://www.zhiliaotang.com/portal.php