《大话设计模式》阅读笔记和总结。原书是C#编写的,本人用Java实现了一遍,包括每种设计模式的UML图实现和示例代码实现。
目录:设计模式
Github地址:DesignPattern
说明
定义:模板方法模式(TemplateMethod),定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。
UML图:
代码实现:
AbstractClass是抽象类,其实也就是一抽象模版,定义并实现了一个模板方法。这个模板方法一般是一个具体方法,它给出一个顶级逻辑的骨架,而逻辑的组成步骤在相应的抽象操作中,推迟到子类实现。
abstract class AbstractClass{
public abstract void PrimitiveOperation1();
public abstract void PrimitiveOperation2();
public void TemplateMethod(){
PrimitiveOperation1();
PrimitiveOperation2();
System.out.println("------");
}
}
ConcreteClass,实现父类所定义的一个或多个抽象方法。
class ConcreteClassA extends AbstractClass{
@Override
public void PrimitiveOperation1() {
System.out.println("具体类A实现1方法");
}
@Override
public void PrimitiveOperation2() {
System.out.println("具体类A实现2方法");
}
}
class ConcreteClassB extends AbstractClass{
@Override
public void PrimitiveOperation1() {
System.out.println("具体类B实现1方法");
}
@Override
public void PrimitiveOperation2() {
System.out.println("具体类B实现2方法");
}
}
客户端调用
public class TemplateMethodPattern {
public static void main(String[] args){
AbstractClass c;
c = new ConcreteClassA();
c.TemplateMethod();
c = new ConcreteClassB();
c.TemplateMethod();
}
}
运行结果
具体类A实现1方法
具体类A实现2方法
------
具体类B实现1方法
具体类B实现2方法
------
示例
例子:小时候数学随堂测验都是老师在黑板上抄题目,然后学生先抄题目,再做答案。用程序实现这个过程。
UML图:
代码实现:
黑板上的试卷-金庸小说考题试卷
public abstract class TestPaper {
public void TestQuestion1(){
System.out.println("第1题");
System.out.println("答案"+Answer1());
}
public abstract String Answer1();
public void TestQuestion2(){
System.out.println("第2题");
System.out.println("答案"+Answer2());
}
public abstract String Answer2();
public void TestQuestion3(){
System.out.println("第3题");
System.out.println("答案"+Answer3());
}
public abstract String Answer3();
}
学生甲抄的试卷
public class TestPaperA extends TestPaper {
@Override
public String Answer1() {
return "b";
}
@Override
public String Answer2() {
return "c";
}
@Override
public String Answer3() {
return "d";
}
}
学生乙抄的试卷
public class TestPaperB extends TestPaper {
@Override
public String Answer1() {
return "c";
}
@Override
public String Answer2() {
return "b";
}
@Override
public String Answer3() {
return "a";
}
}
客户端调用
public class Main {
public static void main(String[] args){
System.out.println("学生甲抄的试卷:");
TestPaper studentA = new TestPaperA();
studentA.TestQuestion1();
studentA.TestQuestion2();
studentA.TestQuestion3();
System.out.println("学生乙抄的试卷:");
TestPaper studentB = new TestPaperB();
studentB.TestQuestion1();
studentB.TestQuestion2();
studentB.TestQuestion3();
}
}
运行结果
学生甲抄的试卷:
第1题
答案b
第2题
答案c
第3题
答案d
学生乙抄的试卷:
第1题
答案c
第2题
答案b
第3题
答案a
模板方法模式特点
模板方法模式是通过把不变行为搬移到超类,去除子类中的重复代码来体现它的优势。当不变和可变的行为在方法的子类实现中混合在一起的时候,不变的行为就会在子类中重复出现。我们通过模板方法模式把这些行为搬移到单一的地方,这样就帮助子类摆脱重复的不变行为的纠缠。