1. 程式人生 > >設計模式--模板模式

設計模式--模板模式

pos 架設 nvi array ava iter reg new ken

http://www.cnblogs.com/java-my-life/archive/2012/05/14/2495235.html

模板模式

一句話來說,就是比人將骨架設計好,你自己填充其余的東西就好了。

上文鏈接的這篇講解模板模式的文章寫的太好了,自己不想再重復寫一遍,有不懂的地方,直接看上文鏈接就好。

接下來將自己的思考記錄一下。

模板方法,常見的一個地方就是servlet的實現。首先在web.xml文件中配置,此外需要實現HttpServlet的抽象類。最後在子類中重寫doGet()和doPost()方法就可以正常跑程序了。當時很困惑裏面的原因,今天看到模板設計模式並翻了Servlet的源碼,才明白其中的道理。再簡單不過。慚愧。自己要多動手,實踐。實踐出真知。

另一處看到模板方法的例子是在Spring源碼中。

 1 protected void doRegisterBeanDefinitions(Element root) {
 2         String profileSpec = root.getAttribute(PROFILE_ATTRIBUTE);
 3         if (StringUtils.hasText(profileSpec)) {
 4             Assert.state(this.environment != null, "Environment must be set for evaluating profiles");
5 String[] specifiedProfiles = StringUtils.tokenizeToStringArray( 6 profileSpec, BeanDefinitionParserDelegate.MULTI_VALUE_ATTRIBUTE_DELIMITERS); 7 if (!this.environment.acceptsProfiles(specifiedProfiles)) { 8 return; 9 } 10 }
11 12 // Any nested <beans> elements will cause recursion in this method. In 13 // order to propagate and preserve <beans> default-* attributes correctly, 14 // keep track of the current (parent) delegate, which may be null. Create 15 // the new (child) delegate with a reference to the parent for fallback purposes, 16 // then ultimately reset this.delegate back to its original (parent) reference. 17 // this behavior emulates a stack of delegates without actually necessitating one. 18 BeanDefinitionParserDelegate parent = this.delegate; 19 this.delegate = createDelegate(this.readerContext, root, parent); 20 21 preProcessXml(root); 22 parseBeanDefinitions(root, this.delegate); 23 postProcessXml(root); 24 25 this.delegate = parent; 26 }

在21行和23行的地方,應該是處理XML文件的前後處理,但是進到方法裏面才發現,空空如也。

 1     /**
 2      * Allow the XML to be extensible by processing any custom element types first,
 3      * before we start to process the bean definitions. This method is a natural
 4      * extension point for any other custom pre-processing of the XML.
 5      * <p>The default implementation is empty. Subclasses can override this method to
 6      * convert custom elements into standard Spring bean definitions, for example.
 7      * Implementors have access to the parser‘s bean definition reader and the
 8      * underlying XML resource, through the corresponding accessors.
 9      * @see #getReaderContext()
10      */
11     protected void preProcessXml(Element root) {
12     }

在源碼preProcessXml()的上方註釋中看到,可以自定義子類,重寫這個方法,這就達到了類的擴展的目的。

設計模式--模板模式