一、定义
模板方法模式定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。
当我们要完成在某一细节层次一致的一个过程或一系列步骤,但其个别步骤在更详细的层次上的实现可能不同时,我们通常会考虑模板方法模式来处理。
模板方法模式很好的诠释了代码复用,通过把不变的行为搬移到父类中取,去除子类中的重复代码来体现它的优势。
二、UML类图
三、实现
- 模板方法抽象类
package com.jthao.design.des.templatemethod;
public abstract class AbstractClass {
protected abstract void doAnyThing();
protected abstract void doSomeThing();
protected void hookMethod() {
System.out.println("空方法");
}
private void concreteMethod() {
System.out.println("已实现的基本方法,由AbstractClass类实现");
}
public void templateMethod() {
hookMethod();
concreteMethod();
doAnyThing();
doSomeThing();
}
}
- 具体实现类A
package com.jthao.design.des.templatemethod;
public class ConcreteClass1 extends AbstractClass {
@Override
public void doAnyThing() {
System.out.println("ConcreteClass1 doAnyThing");
}
@Override
public void doSomeThing() {
System.out.println("ConcreteClass1 doAnyThing");
}
@Override
public void hookMethod() {
System.out.println("ConcreteClass1 重写父类方法");
}
}
- 具体实现类B
package com.jthao.design.des.templatemethod;
public class ConcreteClass2 extends AbstractClass {
@Override
public void doAnyThing() {
System.out.println("ConcreteClass2 doAnyThing");
}
@Override
public void doSomeThing() {
System.out.println("ConcreteClass2 doAnyThing");
}
}
- 测试类
package com.jthao.design.des.templatemethod;
public class templateTest {
public static void main(String[] args) {
AbstractClass abstractClass1 = new ConcreteClass1();
abstractClass1.templateMethod();
AbstractClass abstractClass2 = new ConcreteClass2();
abstractClass2.templateMethod();
}
}