模板方法模式
模板方法模式:定义一个操作中的算法骨架,而将一些步骤延迟的到子类中。模板方法可以使得子类不改变一个算法的结构即可重定义该算法的某些特定步骤。
模板方法结构图如下:
模板方法结构图代码解析:
public abstract class AbstractClass{
//需要由特定子类实现的方法
public abstract void primitiveOperation1();
public abstract void primitiveOperation2();
//模板方法,给出了算法逻辑的骨架,而逻辑的组成是一些抽象的操作,推迟到子类去实现。
public void TemplateMethod(){
primitiveOperation1();
primitiveOperation2();
}
}
//ConcreteClass,实现父类的一个或多个抽象方法。
public class ConcreteClass extends AbstractClass{
@Override
public void primitiveOperation1(){
print("该子类的算法实现...");
}
@Override
public void primitiveOperation2(){
print("该子类的算法实现...");
}
}
模板方法模式的特点:
模板方法模式就是提供了一个很好的代码复用平台。
当不变的和可变的行为在方法的子类实现中混合在一起时,不变的行为会在子类中重复出现,此时可以通过模板方法模式将不变的行为搬到父类中,帮助子类摆脱重复行为。
举个例子看一下:
/**
* Created by 杨Sir on 2017/11/18.
* 模板类,封装子类相同的代码
*/
public abstract class TestPaper {
//这种设计符合迪米特法则,对外只提供一个接口,
//将TestQuest封装为private,然后封装,这样做试题的顺序会被固定
//如果想让每个学生的试题顺序不固定,则可以将试题方法设置为 public,然后在客户端调用。
public void shiJuan(){
TestQuest1();
TestQuest2();
}
private void TestQuest1(){
System.out.println("你喜欢什么语言?[] a.Java b.C++ c.Html d.JavaScript");
System.out.println("答案是:"+ Quest1Resulst());
}
private void TestQuest2(){
System.out.println("你喜欢什么数据库?[] a.Oracle b.SqlServer c.Redis d.MySql");
System.out.println("答案是:"+ Quest2Resulst());
}
//这两个方法是为了让子类重写,因为每个人的选择都会不同
protected abstract String Quest1Resulst();
protected abstract String Quest2Resulst();
}
/**
* Created by 杨Sir on 2017/11/18.
* 子类 A, 实现父类的抽象方法, 此时子类之间没有重复代码
*/
public class TestPaperA extends TestPaper {
@Override
protected String Quest1Resulst() {
return "a";
}
@Override
protected String Quest2Resulst() {
return "d";
}
}
/**
* Created by 杨Sir on 2017/11/18.
* 子类B ,实现父类的两个抽象方法。
*/
public class TestPaperB extends TestPaper {
@Override
public String Quest1Resulst() {
return "a";
}
@Override
public String Quest2Resulst() {
return "b";
}
}
/**
* Created by 杨Sir on 2017/11/18.
*/
public class Main {
public static void main(String[] args) {
System.out.println("学生A的问卷");
TestPaper stuA = new TestPaperA();
stuA.shiJuan();
System.out.println("学生B的问卷");
TestPaper stuB = new TestPaperB();
stuB.shiJuan();
}
}