設計模式--模板模式
阿新 • • 發佈:2018-02-12
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()的上方註釋中看到,可以自定義子類,重寫這個方法,這就達到了類的擴展的目的。
設計模式--模板模式