模板方法模式
模板方法模式的定义
1.定义:
定义一个操作中的算法的骨架,而将一些步骤延迟到子类中;模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤
所有的重复的代码上升到父类去,而不是让每个子类都去重复
模板方法使通过把不变行为搬到超类,去除子类中的重复代码来体现它的优势,提供了一个很好的代码复用的平台,当不变的和可变的行为在方法中的子类实现中混在一起的时候,不变的行为就会在子类中重复出现;我们通过模板方法把这些行为搬到单一的地方,这样就可以帮助子类拜托重复的不变行为的纠缠
模板方法模式结构图
image-20210316143359876.png
模板方法模式的实现
代码结构图
image-20210316143509453.png
1.新建一个抽象父类TestPaper 对应模板方法中的AbstractClass,定义算法的骨架及子类重定义的方法
package org.example.template;
/**
* @author
* @date 2021/3/16 14:00
**/
public class TestPaper {
public void TestQuestion1(){
System.out.println("第一題");
System.out.println("答案是:"+Answer1());
}
public void TestQuestion2(){
System.out.println("第二題");
System.out.println("答案是:"+Answer2());
}
public void TestQuestion3(){
System.out.println("第三題");
System.out.println("答案是:"+Answer3());
}
public void TestQuestion4(){
System.out.println("第四題");
System.out.println("答案是:"+Answer4());
}
//抽象行为给子类去实现
protected String Answer1(){
return "";
}
protected String Answer2(){
return "";
}
protected String Answer3(){
return "";
}
protected String Answer4(){
return "";
}
}
2.新建具体的TestPaperA及TestPaper对应模板方法模式的ConcreteClass,并实现父类定义给子类实现的方法
public class TestPaperA extends TestPaper{
@Override
protected String Answer1() {
return "a";
}
@Override
protected String Answer2() {
return "b";
}
@Override
protected String Answer3() {
return "c";
}
@Override
protected String Answer4() {
return "d";
}
}
public class TestPaperB extends TestPaper{
@Override
protected String Answer1() {
return "d";
}
@Override
protected String Answer2() {
return "c";
}
@Override
protected String Answer3() {
return "b";
}
@Override
protected String Answer4() {
return "a";
}
}
3.客户端调用
package org.example.template;
/**
* @author
* @date 2021/3/16 14:17
**/
public class Client {
public static void main(String[] args) {
System.out.println("學生A答案如下:");
//用父类接收,多态
TestPaper testPaperA = new TestPaperA();
testPaperA.TestQuestion1();
testPaperA.TestQuestion2();
testPaperA.TestQuestion3();
testPaperA.TestQuestion4();
System.out.println("學生B答案如下:");
TestPaper testPaperB = new TestPaperB();
testPaperB.TestQuestion1();
testPaperB.TestQuestion2();
testPaperB.TestQuestion3();
testPaperB.TestQuestion4();
}
}
4.运行结果
image-20210316144024455.png
模板方法的优缺点
优点
1.把不可改变的封装起来,把能够改变的扩展开来,符合开闭原则
2.把很多类的共同操作给封装起来,利于维护
3.其实我们发现,我们在定义行为时候都是由父类去定义,然后子类去实现即可
缺点
虽然我们把一些类的共同操作封装起来,但是当这些类比较多时,效果就不会很好,会多很多类,提高编译效率,提升内存开销