【设计模式】模版模式

介绍

定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。
这种类型的设计模式属于结构性模式。

代码实例

媒婆有两个徒弟,work() 里面的方法步骤是她给徒弟的日常工作安排
1:找客户
2:根据客户要求,介绍合适的人给客户
3:撮合男女双方见面
……
具体的细节,让徒弟自己扩展

public abstract class MeiPo {
    abstract void searchforRequest();
    abstract void doing();
    abstract void meetManAndMomen();

    //模板方法核心,抽取出子类的共性
    public final void work(){

        //寻找有需求的顾客
        searchforRequest();

        //根据顾客需求,物色合适对象
        doing();

        //撮合男女双方
        meetManAndMomen();


    }
}

媒婆1号徒弟的工作安排

/**
 * 媒婆1号徒弟,只给女顾客介绍对象
 */
public class MeiPoTudi1 extends  MeiPo {
    @Override
    void searchforRequest() {
        System.out.println("寻找想找对象的女客户");
    }

    @Override
    void doing() {
        System.out.println("给女客户物色合适的男生");
    }

    @Override
    void meetManAndMomen() {
        System.out.println("撮合男女双方见面,看女方反馈");
    }
}

媒婆2号徒弟的工作安排

/**
 * 媒婆2号徒弟,只给男顾客介绍对象
 */
public class MeiPoTudi2 extends  MeiPo {
    @Override
    void searchforRequest() {
        System.out.println("寻找想找对象的男客户");
    }

    @Override
    void doing() {
        System.out.println("给男客户物色合适的女生");
    }

    @Override
    void meetManAndMomen() {
        System.out.println("撮合男女双方见面,看男方反馈");
    }
}

客户端测试

public class TemplatePatternTest {
    public static void main(String[] args) {

        MeiPo meiPo1 = new MeiPoTudi1();
        meiPo1.work();
        System.out.println();
       MeiPo meiPo2 = new MeiPoTudi2();
        meiPo2.work();
    }
}
模版方法类图

在这里插入图片描述

这个就是模版方法,将通用的逻辑在抽象类(MeiPo)中抽象出来,具体的步骤在子类中实现

应用实例

Spring源码里面 DispatcherServlet#initStrategies()初始化策略方法

    protected void initStrategies(ApplicationContext context) {
        //多文件上传的组件
        initMultipartResolver(context);
        //初始化本地语言环境
        initLocaleResolver(context);
        //初始化模板处理器
        initThemeResolver(context);
        //handlerMapping
        initHandlerMappings(context);
        //初始化参数适配器
        initHandlerAdapters(context);
        //初始化异常拦截器
        initHandlerExceptionResolvers(context);
        //初始化视图预处理器
        initRequestToViewNameTranslator(context);
        //初始化视图转换器
        initViewResolvers(context);
        //
        initFlashMapManager(context);
    }

使用场景

1、有多个子类共有的方法,且逻辑相同。 2、重要的、复杂的方法,可以考虑作为模板方法。

优缺点
优点: 1、封装不变部分,扩展可变部分。 2、提取公共代码,便于维护。 3、行为由父类控制,子类实现。

缺点:每一个不同的实现都需要一个子类来实现,导致类的个数增加,使得系统更加庞大。

阅读 80

推荐阅读
目录