模板方法template method
定义了一个操作中的算法骨架,将某些步骤延迟到子类中实现,新的子类可以在不改变
一个算法的前提下重新定义该算法的特定步骤。
1.场景
到医院看病:
其中挂号,交钱,拿药都是固定步骤,看病需要根据病情到不同的科室。
2.实现
- 子类不能调用父类,而通过父类调用子类,这些步骤已在父类中定义好,完全由父类控制整个过程。
- 所以当实现一个算法时,整体步骤很固定,但某些部分易改变,易变部分可以抽象出来,供子类实现。
- 将具体步骤写到抽象类中,易变方法(看病)定义为抽象方法,并在抽象类中定义步骤,抽查方法由子类实现
package com.liang.templateMethod;
public abstract class HospitilTemplateMethod {
private void register() {
System.out.println("挂号");
}
public abstract void seeDoctor();//可由子类实现,也可由调用者通过匿名内部类实现
private void payMoney() {
System.out.println("交钱");
}
private void getMedicine() {
System.out.println("取药");
}
public final void flow() { //由本抽象类定义此步骤,final不可被子类重写此方法
this.register();
this.seeDoctor();
this.payMoney();
this.getMedicine();
}
}
package com.liang.templateMethod;
/**
* @author Administrator
*
*/
public class Client {
public static void main(String[] args) {
HospitilTemplateMethod htm=new HospitilTemplateMethod() {
@Override
public void seeDoctor() {
// TODO 自动生成的方法存根
System.out.println("到外科看医生");
}
};
htm.flow();
}
}