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

歡迎訪問(wèn) 生活随笔!

生活随笔

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

asp.net

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

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

概念

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

抽象摸板角色:(抽象父類(lèi))

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

  • 實(shí)現(xiàn)父類(lèi)所定義的一個(gè)或多個(gè)抽象方法
  • 每一個(gè)抽象摸板角色都可以有任意多個(gè)具體摸板角色與之對(duì)應(yīng)
  • 每一個(gè)具體摸板角色都可以給出這些抽象方法的不同實(shí)現(xiàn)
  • 模板方法模式就是基于繼承的代碼復(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):

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

    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() 來(lái)演示游戲的定義方式。

    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
    驗(yàn)證輸出。

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

    //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è)計(jì)模式、策略模式 處理DAO中的增刪改查
    設(shè)計(jì)模式總結(jié)

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

    總結(jié)

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

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