学习笔记-设计模式之模板方法模式

本文内容源于视频教程,若有侵权,请联系作者删除。

一、概念

模板方法模式(Template Method Pattern)是指定义一个算法的骨架,并允许子类为一个或者多个步骤提供实现。模板方法使得子类可以在不改变算法结构的情况下,重新定义算法的某些步骤。

生活中有很多事情是有规律可循的,比如做菜,基本流程是放油->加菜->翻炒->出锅,不同的调料做出来的菜不同,放不同的调料味道也不同,模板方法模式就是把主体流程抽象出来,把部分方法提供给子类实现。

二、实现

需求:实现老师教书的过程,假设老师需要教语文,数学,英语。教书流程是备课(制作PPT)->讲课->布置作业->宣布下课。

话不多说,先上代码。

 1 public class ChineseCourse {
 2 
 3     public void createChineseCourse(){
 4         // 制作PPT
 5         makeChinesePpt();
 6         // 讲课
 7         haveChineseLessons();
 8         // 布置作业
 9         giveChineseHomework();
10         // 宣布下课
11         finishClass();
12     }
13 
14     private void finishClass() {
15         System.out.println("宣布下课");
16     }
17 
18     private void giveChineseHomework() {
19         System.out.println("布置语文作业");
20     }
21 
22     private void haveChineseLessons() {
23         System.out.println("上语文课");
24     }
25 
26     private void makeChinesePpt() {
27         System.out.println("制作语文PPT");
28     }
29 }
 1 public class MathCourse {
 2 
 3     public void createMathCourse(){
 4         // 制作PPT
 5         makeMathPpt();
 6         // 讲课
 7         haveMathLessons();
 8         // 布置作业
 9         giveMathHomework();
10         // 宣布下课
11         finishClass();
12     }
13 
14     private void finishClass() {
15         System.out.println("宣布下课");
16     }
17 
18     private void giveMathHomework() {
19         System.out.println("布置数学作业");
20     }
21 
22     private void haveMathLessons() {
23         System.out.println("上数学课");
24     }
25 
26     private void makeMathPpt() {
27         System.out.println("制作数学PPT");
28     }
29 }
 1 public class EnglishCourse {
 2 
 3     public void createEnglishCourse(){
 4         // 制作PPT
 5         makeEnglishPpt();
 6         // 讲课
 7         haveEnglishLessons();
 8         // 布置作业
 9         giveEnglishHomework();
10         // 宣布下课
11         finishClass();
12     }
13 
14     private void finishClass() {
15         System.out.println("宣布下课");
16     }
17 
18     private void giveEnglishHomework() {
19         System.out.println("布置英语作业");
20     }
21 
22     private void haveEnglishLessons() {
23         System.out.println("上英语课");
24     }
25 
26     private void makeEnglishPpt() {
27         System.out.println("制作英语PPT");
28     }
29 }

测试类

 1 public class TemplateTest {
 2 
 3     public static void main(String[] args) {
 4         ChineseCourse chineseCourse = new ChineseCourse();
 5         chineseCourse.createChineseCourse();
 6 
 7         EnglishCourse englishCourse = new EnglishCourse();
 8         englishCourse.createEnglishCourse();
 9 
10         MathCourse mathCourse = new MathCourse();
11         mathCourse.createMathCourse();
12     }
13 }

虽然基本业务功能可以实现,但是作为有追求的程序员们不难发现,教课的流程基本一致,且部分方法完全可以复用,由此,模板方法出现了。

首先定义模板类

 1 public abstract class CourseTemplate {
 2 
 3     public void createCourse(){
 4         // 制作PPT
 5         makePpt();
 6         // 讲课
 7         haveLessons();
 8         // 布置作业
 9         giveHomework();
10         // 宣布下课
11         finishClass();
12     }
13 
14     public abstract void makePpt();
15 
16     public abstract void haveLessons();
17 
18     public abstract void giveHomework();
19 
20     public void finishClass(){
21         System.out.println("宣布下课");
22     }
23 }

模板类定义了上课的主要流程(备课(制作PPT)->讲课->布置作业->宣布下课)并且实现了部分通用方法(finishClass)。

下面开始改造相关课程

 1 public class ChineseCourse extends CourseTemplate {
 2 
 3     public void giveHomework() {
 4         System.out.println("布置语文作业");
 5     }
 6 
 7     public void haveLessons() {
 8         System.out.println("上语文课");
 9     }
10 
11     public void makePpt() {
12         System.out.println("制作语文PPT");
13     }
14 }
 1 public class EnglishCourse extends CourseTemplate{
 2 
 3     public void giveHomework() {
 4         System.out.println("布置英语作业");
 5     }
 6 
 7     public void haveLessons() {
 8         System.out.println("上英语课");
 9     }
10 
11     public void makePpt() {
12         System.out.println("制作英语PPT");
13     }
14 }
 1 public class MathCourse extends CourseTemplate{
 2 
 3     public void giveHomework() {
 4         System.out.println("布置数学作业");
 5     }
 6 
 7     public void haveLessons() {
 8         System.out.println("上数学课");
 9     }
10 
11     public void makePpt() {
12         System.out.println("制作数学PPT");
13     }
14 
15 }

测试类

public class TemplateTest {

    public static void main(String[] args) {
        CourseTemplate chineseCourse = new ChineseCourse();
        chineseCourse.createCourse();

        CourseTemplate mathCourse = new MathCourse();
        mathCourse.createCourse();

        CourseTemplate englishCourse = new EnglishCourse();
        englishCourse.createCourse();
    }
}

课程只需实现模板类的抽象方法,提高了代码复用性。

posted @ 2020-08-06 23:22  落雨有清·风  阅读(77)  评论(0编辑  收藏  举报