模板方法模式:在一个方法中定义一个算法的骨架,而将一些实现步骤延迟到子类中。
模板方法使得子类可以在不改变算法结构的情况下,重新定义算法中的某些步骤。
AbstractClass.java
package com.flyingh.abs;
public abstract class AbstractClass {
public final void templateMethod() {
step1();
step2();
step3();
step4();
hoop();
}
private void step1() {
// TODO Auto-generated method stub
System.out.println("step1");
}
public abstract void step2();
public abstract void step3();
private void step4() {
// TODO Auto-generated method stub
System.out.println("step4");
}
public void hoop() {
// TODO Auto-generated method stub
}
}
ConcreteClassA.java
package com.flyingh.con;
import com.flyingh.abs.AbstractClass;
public class ConcreteClassA extends AbstractClass {
@Override
public void step2() {
// TODO Auto-generated method stub
System.out.println("a.step2()");
}
@Override
public void step3() {
// TODO Auto-generated method stub
System.out.println("a.step3()");
}
}
ConcreteClassB.java
package com.flyingh.con;
import com.flyingh.abs.AbstractClass;
public class ConcreteClassB extends AbstractClass {
@Override
public void step2() {
// TODO Auto-generated method stub
System.out.println("b.step2()");
}
@Override
public void step3() {
// TODO Auto-generated method stub
System.out.println("b.step3()");
}
@Override
public void hoop() {
// TODO Auto-generated method stub
System.out.println("b.hoop()");
}
}
Client.java
package com.flyingh.client;
import com.flyingh.abs.AbstractClass;
import com.flyingh.con.ConcreteClassA;
import com.flyingh.con.ConcreteClassB;
public class Client {
public static void main(String[] args) {
AbstractClass abs = new ConcreteClassA();
abs.templateMethod();
System.out.println("*******************");
AbstractClass abs2 = new ConcreteClassB();
abs2.templateMethod();
}
}
程序运行结果如下:
step1
a.step2()
a.step3()
step4
*******************
step1
b.step2()
b.step3()
step4
b.hoop()