模版方法模式

定义:

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

适应场景:

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

有点:

1.提高复用性
2.提高扩展性
3.符合开闭原则

缺点:

1.类数目增加
2.增加了系统的复杂度
3.继承关系自身的缺点,如果父类

Coding:

ACourse抽象模版方法

/**
 * @program: design-pattern
 * @description:
 * @author: KingdomCoder
 * @create: 2018/12/31 下午12:29
 **/
public abstract class ACourse {

    //课程制作流程不能被子类重写
    protected final void makeCourse() {
        this.makePPT();
        this.makeVideo();
        if(needWriteAticle()){
            this.needWriteAticle();
        }
        this.packageCourse();

    }

    //制作PPT
    final void makePPT() {
        System.out.println("制作PPT");
    }

    //制作课程视频
    final void makeVideo() {
        System.out.println("制作课程视频");
    }

    //编写手记
    final void writeArticle() {

    }

    //是否需要编写手记---可被子类重写(钩子方法)
    protected boolean needWriteAticle() {
        return false;
    }

    //抽象方法(每个课程的包装都不一样)
    abstract void packageCourse();
}

DesignPatternCourse通过钩子方法控制是否需要写手记

@AllArgsConstructor
@NoArgsConstructor
public class DesignPatternCourse extends ACourse{

    private boolean needWriteArticle = false;

    @Override
    protected boolean needWriteAticle() {
        return true;
    }

    @Override
    void packageCourse() {
        System.out.println("提供课程JAVA代码");
    }
}

FECourser子类实现自己的模版方法

/**
 * @program: design-pattern
 * @description:
 * @author: KingdomCoder
 * @create: 2018/12/31 下午12:37
 **/
@AllArgsConstructor
@NoArgsConstructor
public class FECourser extends ACourse {

    private boolean needWriteArticle = false;



    @Override
    protected boolean needWriteAticle() {
        return needWriteArticle;
    }

    @Override
    void packageCourse() {
        System.out.println("提供前端代码");
        System.out.println("提供前端多媒体素材");
    }
}

Test测试类:

/**
 * @program: design-pattern
 * @description:
 * @author: KingdomCoder
 * @create: 2018/12/31 下午12:39
 **/
public class Test {

    public static void main(String[] args) {
        System.out.println("后端设计模式课程start----");
        ACourse designPattern = new DesignPatternCourse();
        designPattern.makeCourse();
        System.out.println("后端设计模式end---");


        System.out.println("前端设计模式课程start----");
        //将是否写手记由应用层控制
        ACourse feCourse = new FECourser(true);
        feCourse.makeCourse();
        System.out.println("前端设计模式end---");
    }

}

测试结果为:

后端设计模式课程start----
制作PPT
制作课程视频
提供课程JAVA代码
后端设计模式end---
前端设计模式课程start----
制作PPT
制作课程视频
提供前端代码
提供前端多媒体素材
前端设计模式end---

Process finished with exit code 0

UML:

模版方法模式.png
微信公众号欢迎关注.jpg

你可能感兴趣的:(模版方法模式)