美文网首页
模板方法设计模式的使用

模板方法设计模式的使用

作者: 雨落千木的时节 | 来源:发表于2018-10-23 15:50 被阅读0次

    1.什么是模板设计模式

    定义:有一个抽象父类定义了模板方法,子类继承父类的方法,按照各自的需求来实现父类的方法。

    2.类图如下:

    image

    3.代码示例:

    package com.buka.designer.template;
    
    /** 编程是门艺术,设计源于生活!
    
    */
    
    public abstract class Ticket {
    
        //模板方法
    
        public void buyTicket() {
    
            login();
    
            selectTicket();
    
            pay();
    
        }
    
        public final void login() {
    
            System.out.println("登录。。。");
    
        }
    
        //子类必须实现
    
        public abstract void selectTicket();
    
        //子类可以不实现
    
        public void pay() {
    
            System.out.println("支付宝。。。");
    
        }
    
    }
    
    package com.buka.designer.template;
    
    /**
    
    * 火车票
    
    */
    
    public class TrainTicket extends Ticket{
    
        @Override
    
        public void selectTicket() {
    
            System.out.println("选择火车票。。。");
    
        }
    
        @Override
    
        public void pay() {
    
            System.out.println("使用微信支付。。。");
    
        }
    
    }
    
    package com.buka.designer.template;
    
    /**
    
    * 船票
    
    */
    
    public class ShipTicket extends Ticket{
    
        @Override
    
        public void selectTicket() {
    
            System.out.println("选择船票。。。");
    
        }
    
    }
    
    package com.buka.designer.template;
    
    /**
    
    * 测试
    
    */
    
    public class TemplateTest {
    
        public static void main(String[] args) {
    
            Ticket trainTicket = new TrainTicket();
    
            trainTicket.buyTicket();
    
            Ticket shipTicket = new ShipTicket();
    
            shipTicket.buyTicket();
    
        }
    
    }
    
    

    4.使用场景:

    spring源码中使用模板方法设计模式,例如:AbstractXmlApplicationContext作为父类,其子类有ClassPathXmlApplicationContext,FileSystemXmlApplicationContext等等。

    FileSystemXmlApplicationContext集成getResourceByPath方法:

    /* Resolve resource paths as file system paths.
    
    * <p>Note: Even if a given path starts with a slash, it will get
    
    * interpreted as relative to the current VM working directory.
    
    * This is consistent with the semantics in a Servlet container.
    
    * @param path path to the resource
    
    * @return the Resource handle
    
    * @see org.springframework.web.context.support.XmlWebApplicationContext#getResourceByPath
    
    */
    
    @Override
    
    protected Resource getResourceByPath(String path) {
    
    if (path.startsWith("/")) {
    
    path = path.substring(1);
    
    }
    
    return new FileSystemResource(path);
    
    }
    
    }
    

    ClassPathXmlApplicationContext类继承了AbstractXmlApplicationContext的getConfigResources方法

    @Override
    
    @Nullable
    
    protected Resource[] getConfigResources() {
    
    return this.configResources;
    
    }
    

    XmlWebApplicationContext类继承了父类的loadBeanDefinitions,getDefaultConfigLocation两个方法。

    /**
    
    * Loads the bean definitions via an XmlBeanDefinitionReader.
    
    * @see org.springframework.beans.factory.xml.XmlBeanDefinitionReader
    
    * @see #initBeanDefinitionReader
    
    * @see #loadBeanDefinitions
    
    */
    
    @Override
    
    protected void loadBeanDefinitions(DefaultListableBeanFactory beanFactory) throws BeansException, IOException {
    
    // Create a new XmlBeanDefinitionReader for the given BeanFactory.
    
    XmlBeanDefinitionReader beanDefinitionReader = new XmlBeanDefinitionReader(beanFactory);
    
    // Configure the bean definition reader with this context's
    
    // resource loading environment.
    
    beanDefinitionReader.setEnvironment(getEnvironment());
    
    beanDefinitionReader.setResourceLoader(this);
    
    beanDefinitionReader.setEntityResolver(new ResourceEntityResolver(this));
    
    // Allow a subclass to provide custom initialization of the reader,
    
    // then proceed with actually loading the bean definitions.
    
    initBeanDefinitionReader(beanDefinitionReader);
    
    loadBeanDefinitions(beanDefinitionReader);
    
    }
    
    /**
    
    * The default location for the root context is "/WEB-INF/applicationContext.xml",
    
    * and "/WEB-INF/test-servlet.xml" for a context with the namespace "test-servlet"
    
    * (like for a DispatcherServlet instance with the servlet-name "test").
    
    */
    
    @Override
    
    protected String[] getDefaultConfigLocations() {
    
    if (getNamespace() != null) {
    
    return new String[] {DEFAULT_CONFIG_LOCATION_PREFIX + getNamespace() + DEFAULT_CONFIG_LOCATION_SUFFIX};
    
    }
    
    else {
    
    return new String[] {DEFAULT_CONFIG_LOCATION};
    
    }
    
    }
    

    相关文章

      网友评论

          本文标题:模板方法设计模式的使用

          本文链接:https://www.haomeiwen.com/subject/dcjazftx.html