文档章节

【设计模式】模板模式

 慕哲
发布于 2017/04/18 14:11
字数 859
阅读 17
收藏 0

在看Spring ApplicationContext的时候,Spring的ApplicationContext启动的过程是在AbstractApplicationContext中的refresh()方法中实现的。在AbstractApplicationContext中是没有具体的BeanFactory的,同时父类中也没有维护BeanFactroy的实例,AbstractApplicationContext中定义了一些关于BeanFactroy中的抽象方法来供底层的子类来继承。具体如下:

protected abstract void refreshBeanFactory() throws BeansException, IllegalStateException;
protected abstract void closeBeanFactory();
public abstract ConfigurableListableBeanFactory getBeanFactory() throws IllegalStateException;

以上三个方法在refresh()方法被调用,这些方法的具体的实现会在子类(之一)AbstractRefreshableApplicationContext中实现的。

在AbstractRefreshableApplicationContext中,其中refreshBeanFactory()方法中首先会创建一个DefaultListableBeanFactory;然后调用loadBeanDefinitions(DefaultListableBeanFactory beanFactory)方法将BeanDefinition的信息加载到当前的BeanFactory中来。但是这个方法在AbstractRefreshableApplicationContext中没有实现,这个方法被定义成为一个abstract 类型。

loadBeanDefinitions(DefaultListableBeanFactory beanFactory)方法在子类AbstractXmlApplicationContext中实现。主要是将BeanDefinition加载到BeanFactory中来。

综上,在一个类中,一个方法实现一个功能,在实现的过程中有一系列的步骤。其中有一些步骤无法代表当前的类中实现,或者是这些功能可能会有多种实现的方式,这个时候可以将这些步骤抽象出来,声明为一个abstract的方法,然后将这些抽象的方法交给子类去实现。模板模式是通过继承来实现的代码复用。在Spring中反复的使用了模板模式来实现当前的功能。

阎宏博士在《java与模式》一书中描述了模板模式:

模板方法模式是类的行为模式。准备一个抽象类,将部分逻辑以具体方法以及具体构造函数的形式实现,然后声明一些抽象方法来迫使子类实现剩余的逻辑。不同的子类可以以不同的方式实现这些抽象方法,从而对剩余的逻辑有不同的实现。这就是模板方法模式的用意。

一个简单的实例:

模板类:

public abstract class AbstractApplicationContextTemplate {


    public void refresh() {


        System.out.println("开始加载BeanFactory");

        loadBeans();//

        System.out.println("加载beanFactory完成");

        System.out.println("加载的BeanFactory的结果= " + getBeanFactory());

    }

    /**
     * 加载bean对象
     */
    protected abstract void loadBeans();


    /**
     * 获取对应的BeanFactory
     * @return
     */
    protected abstract Map<String, Object> getBeanFactory();
}

实现子类一:

public class ConcurrentApplicationContextTemplate extends AbstractApplicationContextTemplate {

    private Map<String, Object> beanFactory;

    protected void loadBeans() {
        if (beanFactory == null) {
            beanFactory = new HashMap<String, Object>();
        }
        beanFactory.put("001", "hello world ");
        beanFactory.put("002", "ni hao");
        beanFactory.put("003", "你好");

    }

    protected Map<String, Object> getBeanFactory() {
        return this.beanFactory;
    }
}

实现子类二:

public class GenericApplicationContextTemplate extends AbstractApplicationContextTemplate {

    private Map<String, Object> beanFactory;

    protected void loadBeans() {

        if (beanFactory == null) {
            beanFactory = new ConcurrentHashMap<String, Object>();
        }

        beanFactory.put("generic001", "001");
        beanFactory.put("generic002", "002");
        beanFactory.put("generic003", "003");

    }

    protected Map<String, Object> getBeanFactory() {
        return this.beanFactory;
    }
}

调用类:

public class MainTest {


    public static void main(String[] args) {

        AbstractApplicationContextTemplate applicationContextTemplate = new ConcurrentApplicationContextTemplate();
        applicationContextTemplate.refresh();
        AbstractApplicationContextTemplate abstractApplicationContextTemplate2 = new GenericApplicationContextTemplate();
        abstractApplicationContextTemplate2.refresh();

    }
}

引出的问题:

对于父类模板类,主要描述了一些主要的流程,将一些不确定的,或者可能 变化的部分功能抽象成为一个 abstract的方法,然后将具体的交给子类来实现。某种程度上模板模式是一种代码复用和功能扩展的方式。模板模式是通过继承的方式来实现扩展的。是否有其他的方式来实现这种扩展,使用继承来实现这种扩展是否会带来其他的一些特性?

© 著作权归作者所有

粉丝 0
博文 7
码字总数 19795
作品 0
私信 提问
设计模式15——Template Method设计模式

Template Method模板方法设计模式定义一个操作中算法的骨架,将具体步骤的执行延迟到子类中实现。Java中的抽象类就是使用了模板方法设计模式。模板方法设计模式结构如下: 以文档处理为例,T...

小米米儿小
2014/01/24
0
0
【聚能聊话题】聊聊设计模式,封装算法——模板方法模式

前面我们聊了: 什么是设计模式?你知道多少? 你必须知道的六大设计原则 第一个设计模式,我是皇帝我独苗,单例模式 第二个设计模式,工厂方法模式 第三个设计模式,抽象工厂模式 这个真的很...

微wx笑
2018/05/29
0
0
设计模式在vue中的应用(四)

前言 目录整理: 设计模式在vue中的应用(一) 设计模式在vue中的应用(二) 设计模式在vue中的应用(三) 设计模式在vue中的应用(四) 为什么要写这些文章呢。正如设计模式(Design Patter...

hailx
02/13
0
0
模板方法设计模式(Template Method)

最易懂设计模式解析 适配器设计模式 Mybatis代理设计模式 Mybatis多级代理 1. 认识模板方法模式 1.1 模式定义 定义一个操作算法中的框架,而将这些步骤延迟加载到子类中。 它的本质就是固定算...

GuoYanHongS
2018/11/23
0
0
JAVA设计模式之模板方法模式和建造者模式

一、前期回顾 上一篇《Java 设计模式之工厂方法模式与抽象工厂模式》介绍了三种工厂模式,分别是工厂方法模式,简单工厂方法模式,抽象工厂模式,文中详细根据实际场景介绍了三种模式的定义,...

木木匠
2018/11/17
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Python应用:python链表示例

前言 python链表应用源码示例,需要用到python os模块方法、函数和类的应用。 首先,先简单的来了解下什么是链表?链表是一种物理存储单元上非连续、非顺序的存储结构,数据元素的逻辑顺序是...

python小白1
25分钟前
1
0
Source Insight加载源码

Source Insight是一个图形化的源代码查看工具(当然也可以作为编译工具)。如果一个项目的源代码较多,此工具可以很方便地查找到源代码自建的依赖关系。 1.创建工程 下图为Snort源代码的文件...

天王盖地虎626
27分钟前
0
0
nginx-rtmp-module的缺陷分析(二)

nginx-rtmp-module使用指令push和pull来relay媒体流数据,以便分布式部署服务。 当nginx-rtmp-module作为边缘服务器(一般不会向边缘服务器推流)时,使用pull从源服务器获取媒体流数据,俗称...

YoungSagit
27分钟前
0
0
代理模式

保护代理和虚拟代理 虚拟代理 把开销大的操作等到需要执行创建的时候再去执行创建 var myImage = +function () { var imgNode = document.createElement('img'); docume......

莫西摩西
35分钟前
2
0
从国企到互联网,程序员六年四段工作经历,一份被很多 HR都 刷掉的简历!

程序员,六年,四段工作经历,这也许是一份会被很多 HR 刷掉的简历。 从学生时代至今,我经历了两次大的方向转型和一次大的技术转型: 从偏理论推导的数学科学到重工程实践的计算机学科,从「...

我最喜欢三大框架
今天
6
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部