自学内容网 自学内容网

23种设计模式之模板方法模式

1. 简介

**模板方法模式(Template Method Pattern)**是一种行为设计模式。它在一个方法中定义了一个算法的骨架,将一些步骤的实现延迟到子类中。模板方法使得子类可以在不改变算法结构的情况下,重新定义算法中的某些步骤。

  • 结构组成
    • 抽象类(Abstract Class):这是模板方法模式的核心部分。抽象类中定义了一个模板方法,这个模板方法包含了算法的骨架,它按照一定的顺序调用其他的抽象方法和具体方法。抽象方法是一些没有具体实现的方法,这些方法的实现会在子类中完成。具体方法是已经有具体实现的方法,它们在模板方法的算法流程中扮演着固定的角色。
    • 具体子类(Concrete Subclass):具体子类继承自抽象类,它们实现了抽象类中的抽象方法。通过实现这些抽象方法,具体子类可以改变模板方法中某些步骤的具体行为,从而在遵循模板方法所定义的算法骨架的基础上,实现具有不同特性的算法。

2. 代码

2.1 AClass (抽象类)

public abstract class AClass {

    protected final void makeClass(){

        if(flag()){
            this.makeNote();
            this.isMakeNote();
        }
        this.makePPT();
        this.makeVideo();
    }

    protected final void makePPT(){
        System.out.println("Making PPT");
    }

    protected final void makeNote(){
        System.out.println("Making Note");
    }

    protected final void makeVideo(){
        System.out.println("Making Video");
    }

    protected boolean flag(){
        return false;
    }

    public abstract void isMakeNote();
}

2.2 DesignPatternClass (具体实现类)

public class DesignPatternClass extends AClass{

    private boolean flag;

    public DesignPatternClass(boolean flag) {
        this.flag = flag;
    }

    @Override
    public boolean flag() {
        return this.flag;
    }

    @Override
    public void isMakeNote() {
        System.out.println("制作源码的笔记");
    }


}

2.3 H5Class (具体实现类)

public class H5Class extends AClass{

    private boolean flag;

    public H5Class(boolean flag) {
        this.flag = flag;
    }

    @Override
    protected boolean flag() {
        return flag;
    }

    @Override
    public void isMakeNote() {
        System.out.println("H5Class is not make note");
    }
}

2.4 Test (测试)

public class Test {
    public static void main(String[] args) {
        System.out.println("Start DesignPattern------");
        AClass aClass = new DesignPatternClass(true);
        aClass.makeClass();
        System.out.println("Start H5-----------------");
        AClass H5Class = new H5Class(false);
        H5Class.makeClass();
    }
}

2.5 运行结果

Start DesignPattern------
Making Note
制作源码的笔记
Making PPT
Making Video
Start H5-----------------
Making PPT
Making Video

3. 使用场景

  • 框架开发:在框架开发中,模板方法模式被广泛应用。例如,在一个 Web 框架中,处理 HTTP 请求的流程可以被定义为一个模板方法。框架可以在抽象类中定义请求处理的一般步骤,如接收请求、验证请求、执行核心业务逻辑、返回响应等。具体的业务逻辑处理部分可以通过抽象方法留给具体的业务子类去实现,这样就可以在不改变框架请求处理流程的基础上,方便地实现不同的业务功能。
  • 算法框架构建:当需要构建一个算法框架,其中部分步骤是固定的,而部分步骤可能因具体情况而不同时,模板方法模式是很好的选择。例如,在一个排序算法框架中,数据的比较操作可能是固定的,但是数据的读取和存储方式可能因数据来源和存储介质的不同而不同。可以在抽象类中定义排序算法的骨架,包括比较、交换等基本操作,而将数据读取和存储的操作通过抽象方法留给子类实现。

4. 优缺点

  • 优点
    • 代码复用性高:模板方法模式通过将算法的骨架定义在抽象类中,把公共的步骤和行为提取出来,使得这些代码可以被多个子类复用,减少了代码的重复编写。
    • 可维护性和扩展性好:由于算法的结构在抽象类中已经确定,当需要修改算法的整体流程时,只需要在抽象类中修改模板方法即可。而当需要添加新的具体实现时,只需要创建一个新的子类,实现抽象类中的抽象方法,就可以很容易地在不改变原有代码结构的基础上进行扩展。
  • 缺点
    • 子类的限制:子类必须遵循抽象类中定义的模板方法的算法结构,这在一定程度上限制了子类的灵活性。如果子类需要对算法结构进行较大的改变,可能需要重新设计整个继承关系。
    • 模板方法的复杂性:随着模板方法中步骤的增多和复杂程度的增加,模板方法本身可能会变得比较复杂,理解和维护起来可能会有一定的难度。

5. 总结

用一个抽象类做模板,其他实现必须继承它,来实现抽象方法。


原文地址:https://blog.csdn.net/weixin_51395608/article/details/144279604

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!