日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > asp.net >内容正文

asp.net

【设计模式】【行为型模式】模板模式

發(fā)布時間:2023/12/20 asp.net 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【设计模式】【行为型模式】模板模式 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

概念

模板模式定義了一個算法的步驟,并允許子類為一個或多個步驟提供其實踐方式。讓子類在不改變算法架構(gòu)的情況下,重新定義算法中的某些步驟。

抽象摸板角色:(抽象父類)

  • 定義了一個或多個抽象操作,以便讓子類實現(xiàn)
  • 定義并實現(xiàn)了一個摸板方法
  • 具體摸板角色:(具體實現(xiàn)類)

  • 實現(xiàn)父類所定義的一個或多個抽象方法
  • 每一個抽象摸板角色都可以有任意多個具體摸板角色與之對應(yīng)
  • 每一個具體摸板角色都可以給出這些抽象方法的不同實現(xiàn)
  • 模板方法模式就是基于繼承的代碼復(fù)用技術(shù)的。在模板方法模式中,我們可以將相同部分的代碼放在父類中,而將不同的代碼放入不同的子類中。也就是說我們需要聲明一個抽象的父類,將部分邏輯以具體方法以及具體構(gòu)造函數(shù)的形式實現(xiàn),然后聲明一些抽象方法讓子類來實現(xiàn)剩余的邏輯,不同的子類可以以不同的方式來實現(xiàn)這些邏輯。所以模板方法的模板其實就是一個普通的方法,只不過這個方法是將算法實現(xiàn)的步驟封裝起來的。

    模式中的方法種類:

  • 抽象模板角色里提供完整的方法,它完成了所有派生類都要用到的一些基本功能。
  • 抽象模板角色里只提供空方法,把功能全部留給派生類去實現(xiàn)。
  • 抽象模板角色里只包含某些操作的默認(rèn)實現(xiàn),派生類里可以重新定義這些方法的實現(xiàn)。
  • 抽象模板角色里模板方法,他是一個調(diào)用抽象方法,鉤子方法以及具體方法的各種組合。
  • 實例

    創(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ò)展了上述類的實體類。

    Cricket.javapublic class Cricket extends Game {@Overridevoid endPlay() {System.out.println("Cricket Game Finished!");}@Overridevoid initialize() {System.out.println("Cricket Game Initialized! Start playing.");}@Overridevoid startPlay() {System.out.println("Cricket Game Started. Enjoy the game!");} } Football.javapublic class Football extends Game {@Overridevoid endPlay() {System.out.println("Football Game Finished!");}@Overridevoid initialize() {System.out.println("Football Game Initialized! Start playing.");}@Overridevoid startPlay() {System.out.println("Football Game Started. Enjoy the game!");} }

    步驟 3
    使用 Game 的模板方法 play() 來演示游戲的定義方式。

    TemplatePatternDemo.javapublic class TemplatePatternDemo {public static void main(String[] args) {Game game = new Cricket();game.play();System.out.println();game = new Football();game.play(); } }

    步驟 4
    驗證輸出。

    Cricket Game Initialized! Start playing. Cricket Game Started. Enjoy the game! Cricket Game Finished!Football Game Initialized! Start playing. Football Game Started. Enjoy the game! Football Game Finished!

    應(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中可以找到。

    //AbstractRefreshableApplicationContextprotected final void refreshBeanFactory() throws BeansException {if (hasBeanFactory()) {destroyBeans();closeBeanFactory();}try {DefaultListableBeanFactory beanFactory = createBeanFactory();customizeBeanFactory(beanFactory);loadBeanDefinitions(beanFactory);synchronized (this.beanFactoryMonitor) {this.beanFactory = beanFactory;}}catch (IOException ex) {throw new ApplicationContextException("I/O error parsing XML document for application context [" + getDisplayName() + "]", ex);}}

    參考資料:
    模板模式
    使用模板方法設(shè)計模式、策略模式 處理DAO中的增刪改查
    設(shè)計模式總結(jié)

    轉(zhuǎn)載于:https://www.cnblogs.com/z00377750/p/9396187.html

    總結(jié)

    以上是生活随笔為你收集整理的【设计模式】【行为型模式】模板模式的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。