模板方法模式

1.定义:定义了一个算法的骨架,并允许子类为一个或多个步骤提供实现;
      模板方法使得子类可以在不改变算法结构的情况下,重新定义算法的某些步骤。

2.类型:行为型

3.适用场景:一次性实现一个算法的不变的部分,并将可变的行为留给子类来实现;
        各子类中公共的行为被提取出来并集中到一个公共父类中,从而避免代码重复。

4.优点:提高复用性、提供扩展性、符合开闭原则。

5.缺点:类数目增加,增加了系统实现的复杂度;继承关系自身缺点,
      如果父类添加新的抽象方法,所有子类都要改一遍。

6.扩展:钩子方法

7.相关设计模式:工厂方法模式、策略模式。

8.实例目录package

9.实例UML类图

10.代码

 1 package com.geely.design.pattern.behavioral.templatemethod;
 2 
 3 public abstract class ACourse {
 4     protected final void makeCourse(){
 5         makePPT();
 6         makeVideo();
 7         if(needWriteArticle()){
 8             writeArtile();
 9         }
10         packageCourse();
11     }
12 
13     final void makePPT(){
14         System.out.println("制作PPT");
15     }
16     final void makeVideo(){
17         System.out.println("制作视频");
18     }
19     final void writeArtile(){
20         System.out.println("编写手记");
21     }
22 
23     protected boolean needWriteArticle(){
24         return false;
25     }
26 
27     abstract void packageCourse();
28 }
 1 package com.geely.design.pattern.behavioral.templatemethod;
 2 
 3 public class DesignPatternCourse extends ACourse {
 4     @Override
 5     protected boolean needWriteArticle() {
 6         return true;
 7     }
 8 
 9     @Override
10     void packageCourse() {
11         System.out.println("提供课程Java源代码");
12     }
13 }
 1 package com.geely.design.pattern.behavioral.templatemethod;
 2 
 3 public class FECourse extends ACourse{
 4     private boolean needWriteActicleFlag = false;
 5 
 6     public FECourse(boolean needWriteActicleFlag) {
 7         this.needWriteActicleFlag = needWriteActicleFlag;
 8     }
 9 
10     @Override
11     protected boolean needWriteArticle() {
12         return needWriteActicleFlag;
13     }
14 
15     @Override
16     void packageCourse() {
17         System.out.println("提供课程前端代码");
18         System.out.println("提供课程的图片等多媒体素材");
19     }
20 }
 1 package com.geely.design.pattern.behavioral.templatemethod;
 2 
 3 public class Test {
 4     public static void main(String[] args) {
 5         System.out.println("后端设计模式课程start---");
 6         ACourse designPatternCourse = new DesignPatternCourse();
 7         designPatternCourse.makeCourse();
 8         System.out.println("后端设计模式课程end---");
 9 
10         System.out.println("前端课程start---");
11         ACourse feCourse = new FECourse(true);
12         feCourse.makeCourse();
13         System.out.println("前端课程end---");
14     }
15 }

 

posted @ 2019-01-06 16:50  逢春  阅读(184)  评论(0编辑  收藏  举报