设计模式学习(三)- 模板方法模式
1.模板方法模式表现形式
模板方法模式,定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。
模板方法模式是通过把不变行为搬移到超类,去除子类中的重复代码来体现它的优势。
当不变的和可变的行为在方法的子类实现中混合在一起的时候,不变的行为就会在子类中重复出现,我们通过模板方法模式把这些行为搬移到单一的地方,这样就帮助子类摆脱重复的不变行为的纠缠。
2.模板方法模式UML图
3.模板方法模式实例
3.1 重复数据类(最高父接口)
package cn.liulin.algorithm.dhdesign.mb;
/**
* cn.liulin.algorithm.dhdesign.mb$
* 所有问题的父类
* @author ll
* @date 2021-06-07 14:43:17
**/
public abstract class TestPaper {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public void testQuestion1() {
System.out.println("今天你吃饭了吗?\na.吃了 b没吃");
System.out.println(this.name + "答案:" + answer1());
}
public void testQuestion2() {
System.out.println("今天你打游戏了吗?\na.打了 b没打");
System.out.println(this.name + "答案:" + answer2());
}
public void testQuestion3() {
System.out.println("今天你游泳了吗?\na.游了 b没游");
System.out.println(this.name + "答案:" + answer3());
}
public abstract String answer1();
public abstract String answer2();
public abstract String answer3();
}
3.2 路人A回答
package cn.liulin.algorithm.dhdesign.mb;
/**
* cn.liulin.algorithm.dhdesign.mb$
*
* @author ll
* @date 2021-06-07 14:47:27
**/
public class TestPaperA extends TestPaper{
@Override
public String answer1() {
return "a";
}
@Override
public String answer2() {
return "b";
}
@Override
public String answer3() {
return "b";
}
}
3.3 路人B回答
package cn.liulin.algorithm.dhdesign.mb;
/**
* cn.liulin.algorithm.dhdesign.mb$
*
* @author ll
* @date 2021-06-07 14:47:59
**/
public class TestPaperB extends TestPaper{
@Override
public String answer1() {
return "b";
}
@Override
public String answer2() {
return "a";
}
@Override
public String answer3() {
return "a";
}
}
3.4 执行
package cn.liulin.algorithm.dhdesign.mb;
/**
* cn.liulin.algorithm.dhdesign.mb$
*
* @author ll
* @date 2021-06-07 14:48:30
**/
public class Main {
public static void main(String[] args) {
TestPaper testPaperA = new TestPaperA();
testPaperA.setName("路人A");
testPaperA.testQuestion1();
testPaperA.testQuestion2();
testPaperA.testQuestion3();
TestPaper testPaperB = new TestPaperB();
testPaperB.setName("路人B");
testPaperB.testQuestion1();
testPaperB.testQuestion2();
testPaperB.testQuestion3();
}
}
3.5 执行结果
今天你吃饭了吗?
a.吃了 b没吃
路人A答案:a
今天你打游戏了吗?
a.打了 b没打
路人A答案:b
今天你游泳了吗?
a.游了 b没游
路人A答案:b
今天你吃饭了吗?
a.吃了 b没吃
路人B答案:b
今天你打游戏了吗?
a.打了 b没打
路人B答案:a
今天你游泳了吗?
a.游了 b没游
路人B答案:a