模板方法模式

简介: 《大话设计模式》阅读笔记和总结。原书是C#编写的,本人用Java实现了一遍,包括每种设计模式的UML图实现和示例代码实现。目录:设计模式Github地址:DesignPattern说明定义:模板方法模式(TemplateMethod),定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。

《大话设计模式》阅读笔记和总结。原书是C#编写的,本人用Java实现了一遍,包括每种设计模式的UML图实现和示例代码实现。
目录:设计模式
Github地址:DesignPattern

说明

定义:模板方法模式(TemplateMethod),定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。

UML图:

img_31f61d37c6b03ce556d525ea6da764dd.png
模板方法模式UML图.png

代码实现:

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图:

img_0bc3723d014afc35c3a614cc9f611c63.png
模板方法模式示例UML图.png

代码实现:

黑板上的试卷-金庸小说考题试卷

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

模板方法模式特点

模板方法模式是通过把不变行为搬移到超类,去除子类中的重复代码来体现它的优势。当不变和可变的行为在方法的子类实现中混合在一起的时候,不变的行为就会在子类中重复出现。我们通过模板方法模式把这些行为搬移到单一的地方,这样就帮助子类摆脱重复的不变行为的纠缠。

目录
相关文章
|
2月前
|
设计模式 算法 Java
Java设计模式-模板方法模式(14)
Java设计模式-模板方法模式(14)
|
3月前
|
设计模式 算法
模板方法模式
【8月更文挑战第22天】
28 0
|
3月前
|
设计模式 算法
什么是模板方法模式?
【8月更文挑战第22天】
41 0
|
6月前
|
设计模式 算法 Java
Java设计模式——模板方法模式
Java设计模式——模板方法模式
|
算法 前端开发
关于模板方法模式我所知道的
关于模板方法模式我所知道的
90 0
|
算法 Java 程序员
行为型模式-模板方法模式
行为型模式-模板方法模式
95 0
|
设计模式
我学会了,模板方法模式
模板方法模式属于行为型模式,这个类型的设计模式总结出了 类、对象之间的经典交互方式,将类、对象的行为和使用解耦了,花式的去使用对象的行为来完成特定场景下的功能。
80 0
我学会了,模板方法模式
|
SQL 设计模式 Java
|
设计模式 算法 Java
Java设计模式 ->模板方法模式
Java设计模式 ->模板方法模式
96 0
|
设计模式 算法 Java
Java设计模式-模板方法模式
Java设计模式-模板方法模式
155 0
Java设计模式-模板方法模式