模板方法设计模式(Template Method)
  anLrwkgbyYZS 2023年12月30日 14 0


1. 概述

组成模板的方法被定义在父类中,由于这些方法是抽象方法,在父类中无法查看这些方法的具体实现,唯一可以知道的就是父类如何调用这些方法的。这种在父类中定义处理流程的框架,在子类中实现具体处理的模式就是模板方法(Template Method)设计模式。

举一个例子:学生都需要去上课,其上课的具体流程是上课、听课、下课,但是不同类学生听课(上课、下课)的具体内容不同,不过它们的流程相同,即上课->听课->下课,就可以在父类中定义上课、听课、下课三个抽象方法,具体实现交给不同的子类,然后在父类中创建一个完整的上课流程的框架,调用这三个方法(上课、听课、下课),接下来会用代码实现这个例子。

2. 代码实现

父类,一个抽象类,负责实现模板方法(theClassDisplay()),声明模板方法所使用到的抽象方法(startClass()上课 、inClass()上课中 、endClass()下课)。ClassAbstractDisplay.java 代码如下所示:

package template;

public abstract class ClassAbstractDisplay {
    public abstract void startClass(); // 上课
    public abstract void inClass(); // 上课中
    public abstract void endClass(); // 下课
    public void theClassDisplay() { //上课的整个流程展示
        startClass();
        for (int i=0; i<5; i++) {
            inClass();
        }
        endClass();
    }
}

两个具体子类如下,美术课,ArtClassDisplay.java :

package template;

public class ArtClassDisplay extends ClassAbstractDisplay{
    public void startClass() {
        System.out.println("##开始上美术课##");
    }
    public void inClass() {
        System.out.println("美术课正在上课中...");
    }
    public void endClass() {
        System.out.println("##美术课结束了##");
    }
}

数学课,MathClassDisplay.java:

package template;

public class MathClassDisplay extends ClassAbstractDisplay{
    public void startClass() {
        System.out.println("**开始上数学课**");
    }
    public void inClass() {
        System.out.println("...数学课正在上课中");
    }
    public void endClass() {
        System.out.println("**数学课结束了**");
    }
}

实例的UML图所示:

模板方法设计模式(Template Method)_System

测试代码:

package template;

public class test {
    public static void main(String args[]) {
        ClassAbstractDisplay class01 = new ArtClassDisplay();
        ClassAbstractDisplay class02 = new MathClassDisplay();
        class01.theClassDisplay();
        class02.theClassDisplay();
    }
}

测试结果如下所示:

模板方法设计模式(Template Method)_java_02

参考文献:

  • 图解设计模式 - 结成浩著、杨文轩译 - 人民邮电出版社

END。

【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2023年12月30日 0

暂无评论

推荐阅读
  ijEHlwWobBkw   4天前   12   0   0 Java
  DKE3T9FhmJBk   4天前   12   0   0 Java
  T3It887JLZgD   5天前   15   0   0 Java
  2xk0JyO908yA   4天前   17   0   0 Java
anLrwkgbyYZS