【设计模式】【行为型模式】模板模式
概念
模板模式定義了一個算法的步驟,并允許子類為一個或多個步驟提供其實踐方式。讓子類在不改變算法架構(gòu)的情況下,重新定義算法中的某些步驟。
抽象摸板角色:(抽象父類)
具體摸板角色:(具體實現(xiàn)類)
模板方法模式就是基于繼承的代碼復(fù)用技術(shù)的。在模板方法模式中,我們可以將相同部分的代碼放在父類中,而將不同的代碼放入不同的子類中。也就是說我們需要聲明一個抽象的父類,將部分邏輯以具體方法以及具體構(gòu)造函數(shù)的形式實現(xiàn),然后聲明一些抽象方法讓子類來實現(xiàn)剩余的邏輯,不同的子類可以以不同的方式來實現(xiàn)這些邏輯。所以模板方法的模板其實就是一個普通的方法,只不過這個方法是將算法實現(xiàn)的步驟封裝起來的。
模式中的方法種類:
實例
創(chuàng)建一個定義操作的 Game 抽象類,其中,模板方法設(shè)置為 final,這樣它就不會被重寫。Cricket 和 Football 是擴(kuò)展了 Game 的實體類,它們重寫了抽象類的方法。
TemplatePatternDemo,我們的演示類使用 Game 來演示模板模式的用法。
步驟 1
創(chuàng)建一個抽象類,它的模板方法被設(shè)置為 final。
Game.javapublic abstract class Game {abstract void initialize();abstract void startPlay();abstract void endPlay();//模板public final void play(){//初始化游戲initialize();//開始游戲startPlay();//結(jié)束游戲endPlay();} }步驟 2
創(chuàng)建擴(kuò)展了上述類的實體類。
步驟 3
使用 Game 的模板方法 play() 來演示游戲的定義方式。
步驟 4
驗證輸出。
應(yīng)用
在Spring中的AbstractApplicationContext的refresh方法中使用了模板模式。
public void refresh() throws BeansException, IllegalStateException {synchronized (this.startupShutdownMonitor) {// Prepare this context for refreshing.prepareRefresh();// Tell the subclass to refresh the internal bean factory.ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory();// Prepare the bean factory for use in this context.prepareBeanFactory(beanFactory);try {// Allows post-processing of the bean factory in context subclasses.postProcessBeanFactory(beanFactory);// Invoke factory processors registered as beans in the context.invokeBeanFactoryPostProcessors(beanFactory);// Register bean processors that intercept bean creation.registerBeanPostProcessors(beanFactory);// Initialize message source for this context.initMessageSource();// Initialize event multicaster for this context.initApplicationEventMulticaster();// Initialize other special beans in specific context subclasses.onRefresh();// Check for listener beans and register them.registerListeners();// Instantiate all remaining (non-lazy-init) singletons.finishBeanFactoryInitialization(beanFactory);// Last step: publish corresponding event.finishRefresh();}catch (BeansException ex) {// Destroy already created singletons to avoid dangling resources.beanFactory.destroySingletons();// Reset 'active' flag.cancelRefresh(ex);// Propagate exception to caller.throw ex;}}}AbstractApplicationContext類中的refresh定義好了代碼邏輯骨架,obtainFreshBeanFactory()方法中調(diào)用了refreshBeanFactory();,該方法在AbstractApplicationContext中是抽象方法,需要在子類中具體實現(xiàn)。
//AbstractApplicationContextprotected ConfigurableListableBeanFactory obtainFreshBeanFactory() {refreshBeanFactory();ConfigurableListableBeanFactory beanFactory = getBeanFactory();if (logger.isInfoEnabled()) {logger.info("Bean factory for application context [" + getId() + "]: " +ObjectUtils.identityToString(beanFactory));}if (logger.isDebugEnabled()) {logger.debug(beanFactory.getBeanDefinitionCount() + " beans defined in " + this);}return beanFactory;}protected abstract void refreshBeanFactory() throws BeansException, IllegalStateException;查看AbstractApplicationContext的子類
最終類是FileSystemXmlApplicationContext,方法的具體實現(xiàn)在AbstractRefreshableApplicationContext中可以找到。
參考資料:
模板模式
使用模板方法設(shè)計模式、策略模式 處理DAO中的增刪改查
設(shè)計模式總結(jié)
轉(zhuǎn)載于:https://www.cnblogs.com/z00377750/p/9396187.html
總結(jié)
以上是生活随笔為你收集整理的【设计模式】【行为型模式】模板模式的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: oracle 数据库,用户管理以及表空间
- 下一篇: 设计模式--动态代理