模板方法模式 Java
意图:
在一个方法中定义一个算法的骨架,而将一些实现步骤延迟到子类中。
模板方法使得子类可以在不改变算法结构的情况下,重新定义算法中的某些步骤。
UML图:
先建立一个骨架:
import java.util.*;
public abstract class template
{
String name="Laughing";
final public void pre() //final 不允许子类改动气框架
{
name();
if(is()) other(); //用钩子技术控制是否要这一个other步骤
}
public void name()
{
System.out.println(name);
}
public abstract void other();
public boolean is()
{
Scanner in=new Scanner(System.in);
String str=in.nextLine();
if("yes".equals(str)) return true;
return false;
}
}
分别写两个子类,并实现abstract方法:
public class liu extends template
{
public void other()
{
System.out.println("Liu");
}
}
public class ju extends template
{
public void other()
{
System.out.println("ju");
}
}
测试一下:
public class test
{
public static void main(String[] args)
{
liu l=new liu();
ju j=new ju();
l.pre();
j.pre();//外观模式
}
}
模板方法模式中的方法:
模板方法:定义在AbstractClass中,形成算法的骨架
基本方法:
1. Abstract Method:由子类具体实现,完成具体的算法步骤。
2. Concrete Method:抽象类实现的final方法,子类不能override。
3. Hook Method:提供缺省的实现,子类可以在必要时进行扩展,钩子简化了子类的实现,它可以让子类能够有机会对模板方法中某些即将发生的(或刚刚发生的)步骤做出反应
适用性:
1. 一次性实现一个算法的不变的部分,并将可变的行为留给子类来实现。
2. 各子类中公共的行为应被提取出来并集中到一个公共父类中以避免代码重复。这是Opdyke和Johnson所描述过的“重分解以一般化”的一个很好的例子。首先识别现有代码中的不同之处,并且将不同之处分离为新的操作。最后,用一个调用这些新的操作的模板方法来替换这些不同的代码。
3. 控制子类扩展。模板方法只在特定点调用Hook操作,这样就只允许在这些点进行扩展。