• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            設(shè)計(jì)模式之template method模式

            算法意圖:

            將算法骨架定義在父類(lèi)當(dāng)中,具體的實(shí)現(xiàn)放到子類(lèi)當(dāng)中。Template method可以不改變算法的骨架在子類(lèi)中重新定義算法中的某些特定的步驟。

            算法適用性:

            1.       一次性將算法的不變部分封裝到父類(lèi)當(dāng)中,將可變的部分放到子類(lèi)中去實(shí)現(xiàn)。

            2.       各子類(lèi)的公共部分亞冠提取出來(lái)放到父類(lèi)當(dāng)中,避免代碼重復(fù),分離變化和不變的地方。

            3.       通過(guò)hook來(lái)控制子類(lèi)的擴(kuò)展。

            4.       模板方法的格式:
            class TemplateMethod_Demo
            {
              public:
                <返回值類(lèi)型> <模板方法名>(<參數(shù)列表>); //模板方法成員函數(shù),定義為公有的非虛成員函數(shù),供客戶(hù)調(diào)用;
              protected:
                virtual <返回值類(lèi)型> <抽象操作的方法名>(<參數(shù)列表>) = 0;//抽象操作(可選),:原語(yǔ)操作,用純虛函數(shù)表示,必須被重定義,定義為保護(hù)類(lèi)型的,只能被模板方法本身調(diào)用;
                virtual <返回值類(lèi)型> <鉤子操作的方法名>(<參數(shù)列表>){};  //鉤子操作(必選),:原語(yǔ)操作,用虛函數(shù)表示,可被重定義,提供缺省實(shí)現(xiàn),定義為保護(hù)類(lèi)型的,只能被模板方法本身調(diào)用;
            };

             

              1// template.cpp : 定義控制臺(tái)應(yīng)用程序的入口點(diǎn)。
              2//
              3
              4#include "stdafx.h"
              5#include<iostream>
              6using namespace std;
              7
              8class AbstractClass
              9{
             10public:
             11     AbstractClass(){}
             12     virtual ~AbstractClass(){}
             13     virtual void doFirst();
             14     virtual void doAfter();
             15     // 這個(gè)函數(shù)中定義了算法的輪廓
             16     void TemplateMethod()
             17     {
             18         doFirst();
             19         PrimitiveOperation1();
             20         PrimitiveOperation2();
             21          if (b_jugle) 
             22          {
             23              doSthElse();
             24          }
             
             25         doAfter();
             26     }

             27     virtual void setHookTrue()
             28     {
             29         AbstractClass::b_jugle = true;
             30     }
            ;
             31
             32protected:
             33     // 純虛函數(shù),由派生類(lèi)實(shí)現(xiàn)之
             34     virtual void PrimitiveOperation1() = 0;
             35     virtual void PrimitiveOperation2() = 0;
             36     virtual void  doSthElse() = 0;
             37     static bool b_jugle;
             38     
             39     
             40}
            ;
             41
             42bool AbstractClass::b_jugle = false;
             43
             44
             45void AbstractClass::doFirst()
             46{
             47    cout<<"do std before"<<endl;
             48}

             49
             50void AbstractClass::doAfter()
             51{
             52    cout<<"do std after"<<endl;
             53}

             54
             55// 繼承自AbstractClass,實(shí)現(xiàn)算法
             56class ConcreateClass: public AbstractClass
             57{
             58public:
             59     ConcreateClass(){}
             60     virtual ~ConcreateClass(){}
             61
             62protected:
             63     virtual void PrimitiveOperation1()
             64     {
             65         cout << "PrimitiveOperation1 by ConcreateClass\n";
             66     }

             67     virtual void PrimitiveOperation2()
             68     {
             69         cout << "PrimitiveOperation2 by ConcreateClass\n";
             70     }

             71     virtual void doSthElse()
             72     {
             73         cout<<"so something else!\n"<<endl;
             74     }

             75}
            ;
             76
             77
             78// 繼承自AbstractClass,實(shí)現(xiàn)算法
             79class ConcreateClassNew: public AbstractClass
             80{
             81public:
             82     ConcreateClassNew(){}
             83     virtual ~ConcreateClassNew(){}
             84    
             85protected:
             86     virtual void PrimitiveOperation1()
             87     {
             88         cout << "PrimitiveOperation1 by ConcreateClassNew\n";
             89     }

             90     virtual void PrimitiveOperation2()
             91     {
             92         cout << "PrimitiveOperation2 by ConcreateClassNew\n";
             93     }

             94      virtual void doSthElse()
             95     {
             96         cout<<"so something else!\n"<<endl;
             97     }

             98    
             99}
            ;
            100
            101
            102int _tmain(int argc, _TCHAR* argv[])
            103{
            104    AbstractClass* pConcreateClass = new ConcreateClass;
            105    pConcreateClass->TemplateMethod();
            106    delete pConcreateClass;
            107
            108
            109    AbstractClass* pConcreateClass2 = new ConcreateClassNew;
            110    pConcreateClass2->setHookTrue();
            111    pConcreateClass2->TemplateMethod();
            112    delete pConcreateClass2;
            113    return 0;
            114}

            115
            116

            運(yùn)行結(jié)果:


            template method的設(shè)計(jì)原則:
            1.封裝變化部分;
            2.對(duì)接口編程
            3. 好萊塢原則:別調(diào)用我們,在我們需要時(shí)會(huì)調(diào)用你

            最后談一下和策略模式的區(qū)別,最主要的區(qū)別是一個(gè)是使用繼承而策略模式是使用組合方式。

            posted on 2012-04-29 11:18 sheng 閱讀(385) 評(píng)論(0)  編輯 收藏 引用


            只有注冊(cè)用戶(hù)登錄后才能發(fā)表評(píng)論。
            網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問(wèn)   Chat2DB   管理


            導(dǎo)航

            <2025年5月>
            27282930123
            45678910
            11121314151617
            18192021222324
            25262728293031
            1234567

            統(tǒng)計(jì)

            常用鏈接

            留言簿(1)

            隨筆檔案

            收藏夾

            同行

            搜索

            最新評(píng)論

            閱讀排行榜

            評(píng)論排行榜

            国内精品久久久久久久久| 国产精品免费看久久久| 久久久久国产亚洲AV麻豆| 中文成人久久久久影院免费观看| 7777精品伊人久久久大香线蕉| 久久精品国产亚洲AV蜜臀色欲| 热re99久久精品国99热| 国产精品xxxx国产喷水亚洲国产精品无码久久一区 | 精品综合久久久久久888蜜芽| 狠狠色噜噜狠狠狠狠狠色综合久久| 99久久99久久精品国产片果冻| 午夜精品久久久久成人| 国内精品九九久久久精品| 久久天天躁狠狠躁夜夜2020| 久久久久高潮毛片免费全部播放 | 欧美无乱码久久久免费午夜一区二区三区中文字幕 | 亚洲精品乱码久久久久久自慰| 亚洲国产成人久久精品影视| 国内精品久久久久久久久电影网| 91超碰碰碰碰久久久久久综合| 久久精品国产精品亚洲精品 | 精品乱码久久久久久夜夜嗨| 日日噜噜夜夜狠狠久久丁香五月| 久久不见久久见免费影院www日本| 久久国产高潮流白浆免费观看| 伊人色综合九久久天天蜜桃| 国产日韩久久免费影院| 国产午夜精品久久久久免费视| 思思久久99热只有频精品66| 久久久久综合中文字幕 | 久久婷婷国产剧情内射白浆| 久久99精品九九九久久婷婷| 国产午夜久久影院| 国产精品美女久久久久久2018| 亚洲国产欧洲综合997久久| 久久无码国产专区精品| 久久99热这里只有精品66| 亚洲Av无码国产情品久久| 欧美午夜A∨大片久久| 深夜久久AAAAA级毛片免费看| 久久夜色撩人精品国产小说|