定义
定义一个操作中的算法的骨架,将一些步骤延迟到子类。模板方法使得子类可以不改变一个算法的结构即可重新定义该算法的某些特定步骤。
UML
public abstract class AbstractClass {
//基本方法
protected abstract void doSomething();
//基本方法
protected abstract void doAnything();
//模板方法调用基本方法,完成相关的逻辑
public void templateMethod(){
this.doAnything();
this.doSomething();
}
}
class ConcreteClass1 extends AbstractClass{
@Override
protected void doSomething() {
System.out.println("do something1");
}
@Override
protected void doAnything() {
System.out.println("do doAnything1");
}
}
class ConcreteClass2 extends AbstractClass{
@Override
protected void doSomething() {
System.out.println("do something2");
}
@Override
protected void doAnything() {
System.out.println("do doAnything2");
}
}
class Client{
public static void main(String[] args) {
AbstractClass c1 = new ConcreteClass1();
AbstractClass c2 = new ConcreteClass2();
c1.templateMethod();
c2.templateMethod();
}
}
特点
- 很好的复用代码,将抽象定义在父类里,子类负责实现。
- 适用场景:某个过程一系列的步骤相同,但是个别步骤实现不同。
示例
public abstract class HummerModel {
public abstract void start();
public abstract void stop();
public abstract void alarm();
public abstract void engineBoom();
public void run(){
this.start();
this.engineBoom();
this.alarm();
this.stop();
}
}
class HummerH1 extends HummerModel {
@Override
public void start() {
System.out.println("悍马1发动");
}
@Override
public void stop() {
System.out.println("悍马1停车");
}
@Override
public void alarm() {
System.out.println("悍马1鸣笛");
}
@Override
public void engineBoom() {
System.out.println("悍马1引擎声音");
}
}
class HummerH2 extends HummerModel {
@Override
public void start() {
System.out.println("悍马2发动");
}
@Override
public void stop() {
System.out.println("悍马2停车");
}
@Override
public void alarm() {
System.out.println("悍马2鸣笛");
}
@Override
public void engineBoom() {
System.out.println("悍马2引擎声音");
}
}
class Client {
public static void main(String[] args) {
HummerModel hm = new HummerH1();
hm.run();
hm = new HummerH2();
hm.run();
}
}