【设计模式】【行为型模式】模板模式
概念
模板模式定義了一個(gè)算法的步驟,并允許子類(lèi)為一個(gè)或多個(gè)步驟提供其實(shí)踐方式。讓子類(lèi)在不改變算法架構(gòu)的情況下,重新定義算法中的某些步驟。
抽象摸板角色:(抽象父類(lèi))
具體摸板角色:(具體實(shí)現(xiàn)類(lèi))
模板方法模式就是基于繼承的代碼復(fù)用技術(shù)的。在模板方法模式中,我們可以將相同部分的代碼放在父類(lèi)中,而將不同的代碼放入不同的子類(lèi)中。也就是說(shuō)我們需要聲明一個(gè)抽象的父類(lèi),將部分邏輯以具體方法以及具體構(gòu)造函數(shù)的形式實(shí)現(xiàn),然后聲明一些抽象方法讓子類(lèi)來(lái)實(shí)現(xiàn)剩余的邏輯,不同的子類(lèi)可以以不同的方式來(lái)實(shí)現(xiàn)這些邏輯。所以模板方法的模板其實(shí)就是一個(gè)普通的方法,只不過(guò)這個(gè)方法是將算法實(shí)現(xiàn)的步驟封裝起來(lái)的。
模式中的方法種類(lèi):
實(shí)例
創(chuàng)建一個(gè)定義操作的 Game 抽象類(lèi),其中,模板方法設(shè)置為 final,這樣它就不會(huì)被重寫(xiě)。Cricket 和 Football 是擴(kuò)展了 Game 的實(shí)體類(lèi),它們重寫(xiě)了抽象類(lèi)的方法。
TemplatePatternDemo,我們的演示類(lèi)使用 Game 來(lái)演示模板模式的用法。
步驟 1
創(chuàng)建一個(gè)抽象類(lèi),它的模板方法被設(shè)置為 final。
Game.javapublic abstract class Game {abstract void initialize();abstract void startPlay();abstract void endPlay();//模板public final void play(){//初始化游戲initialize();//開(kāi)始游戲startPlay();//結(jié)束游戲endPlay();} }步驟 2
創(chuàng)建擴(kuò)展了上述類(lèi)的實(shí)體類(lèi)。
步驟 3
使用 Game 的模板方法 play() 來(lái)演示游戲的定義方式。
步驟 4
驗(yàn)證輸出。
應(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類(lèi)中的refresh定義好了代碼邏輯骨架,obtainFreshBeanFactory()方法中調(diào)用了refreshBeanFactory();,該方法在AbstractApplicationContext中是抽象方法,需要在子類(lèi)中具體實(shí)現(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的子類(lèi)
最終類(lèi)是FileSystemXmlApplicationContext,方法的具體實(shí)現(xiàn)在AbstractRefreshableApplicationContext中可以找到。
參考資料:
模板模式
使用模板方法設(shè)計(jì)模式、策略模式 處理DAO中的增刪改查
設(shè)計(jì)模式總結(jié)
轉(zhuǎn)載于:https://www.cnblogs.com/z00377750/p/9396187.html
總結(jié)
以上是生活随笔為你收集整理的【设计模式】【行为型模式】模板模式的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: oracle 数据库,用户管理以及表空间
- 下一篇: 设计模式--动态代理