• <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>

            C++ Programmer's Cookbook

            {C++ 基礎(chǔ)} {C++ 高級(jí)} {C#界面,C++核心算法} {設(shè)計(jì)模式} {C#基礎(chǔ)}

            模式設(shè)計(jì)c#--行為型--templetemethod

            名稱 Template Method
            結(jié)構(gòu) o_templetemethod.bmp
            意圖 定義一個(gè)操作中的算法的骨架,而將一些步驟延遲到子類中。Te m p l a t e M e t h o d 使得子類可以不改變一個(gè)算法的結(jié)構(gòu)即可重定義該算法的某些特定步驟。
            適用性
            • 一次性實(shí)現(xiàn)一個(gè)算法的不變的部分,并將可變的行為留給子類來實(shí)現(xiàn)。
            • 各子類中公共的行為應(yīng)被提取出來并集中到一個(gè)公共父類中以避免代碼重復(fù)。這是O p d y k e 和J o h n s o n 所描述過的“重分解以一般化”的一個(gè)很好的例子[ O J 9 3 ]。首先識(shí)別現(xiàn)有代碼中的不同之處,并且將不同之處分離為新的操作。最后,用一個(gè)調(diào)用這些新的操作的模板方法來替換這些不同的代碼。
            • 控制子類擴(kuò)展。模板方法只在特定點(diǎn)調(diào)用“h o o k ”操作(參見效果一節(jié)),這樣就只允許在這些點(diǎn)進(jìn)行擴(kuò)展。

            Code Example
            namespace?TemplateMethod_DesignPattern
            {
            ????
            using?System;

            ????
            class?Algorithm?
            ????
            {
            ????????
            public?void?DoAlgorithm()?
            ????????
            {
            ????????????Console.WriteLine(
            "In?DoAlgorithm");
            ????????????
            ????????????
            //?do?some?part?of?the?algorithm?here
            ????????????
            ????????????
            //?step1?goes?here
            ????????????Console.WriteLine("In?Algorithm?-?DoAlgoStep1");????????????
            ????????????
            //?.?.?.?

            ????????????
            //?step?2?goes?here
            ????????????Console.WriteLine("In?Algorithm?-?DoAlgoStep2");????????????
            ????????????
            //?.?.?.?

            ????????????
            //?Now?call?configurable/replacable?part
            ????????????DoAlgoStep3();

            ????????????
            //?step?4?goes?here
            ????????????Console.WriteLine("In?Algorithm?-?DoAlgoStep4");????????????
            ????????????
            //?.?.?.?

            ????????????
            //?Now?call?next?configurable?part
            ????????????DoAlgoStep5();
            ????????}


            ????????
            virtual?public?void?DoAlgoStep3()
            ????????
            {
            ????????????Console.WriteLine(
            "In?Algorithm?-?DoAlgoStep3");????????
            ????????}


            ????????
            virtual?public?void?DoAlgoStep5()
            ????????
            {
            ????????????Console.WriteLine(
            "In?Algorithm?-?DoAlgoStep5");????????????
            ????????}

            ????}


            ????
            class?CustomAlgorithm?:?Algorithm
            ????
            {
            ????????
            public?override?void?DoAlgoStep3()
            ????????
            {
            ????????????Console.WriteLine(
            "In?CustomAlgorithm?-?DoAlgoStep3");
            ????????}


            ????????
            public?override?void?DoAlgoStep5()
            ????????
            {
            ????????????Console.WriteLine(
            "In?CustomAlgorithm?-?DoAlgoStep5");
            ????????}

            ????}


            ????
            ///?<summary>
            ????
            ///????Summary?description?for?Client.
            ????
            ///?</summary>

            ????public?class?Client
            ????
            {
            ????????
            public?static?int?Main(string[]?args)
            ????????
            {
            ????????????CustomAlgorithm?c?
            =?new?CustomAlgorithm();

            ????????????c.DoAlgorithm();

            ????????????
            return?0;
            ????????}

            ????}

            }

            模板方法(Template Method)模式

            準(zhǔn)備一個(gè)抽象類,將部分邏輯以具體方法以及具體構(gòu)造子的形式實(shí)現(xiàn),然后聲明一些抽象方法來迫使子類實(shí)現(xiàn)剩余的邏輯。不同的子類可以以不同的方式實(shí)現(xiàn)這些抽象方法,從而對(duì)剩余的邏輯有不同的實(shí)現(xiàn)。這就是模版方法模式的用意。

            很多人可能沒有想到,模版方法模式實(shí)際上是所有模式中最為常見的幾個(gè)模式之一,而且很多人可能使用過模版方法模式而沒有意識(shí)到自己已經(jīng)使用了這個(gè)模式。模版方法模式是基于繼承的代碼復(fù)用的基本技術(shù),模版方法模式的結(jié)構(gòu)和用法也是面向?qū)ο笤O(shè)計(jì)的核心。

            模版方法模式需要開發(fā)抽象類和具體子類的設(shè)計(jì)師之間的協(xié)作。一個(gè)設(shè)計(jì)師負(fù)責(zé)給出一個(gè)算法的輪廓和骨架,另一些設(shè)計(jì)師則負(fù)責(zé)給出這個(gè)算法的各個(gè)邏輯步驟。代表這些具體邏輯步驟的方法稱做基本方法(primitive method);而將這些基本法方法總匯起來的方法叫做模版方法(template method),這個(gè)設(shè)計(jì)模式的名字就是從此而來。
            ?模版方法模式中的方法

            模版方法中的方法可以分為兩大類:模版方法(Template Method)和基本方法(Primitive Method)。

            模版方法

            一個(gè)模版方法是定義在抽象類中的,把基本操作方法組合在一起形成一個(gè)總算法或一個(gè)總行為的方法。這個(gè)模版方法一般會(huì)在抽象類中定義,并由子類不加以修改地完全繼承下來。

            基本方法

            基本方法又可以分為三種:抽象方法(Abstract Method)、具體方法(Concrete Method)和鉤子方法(Hook Method)。

            抽象方法:一個(gè)抽象方法由抽象類聲明,由具體子類實(shí)現(xiàn)。在C#語(yǔ)言里一個(gè)抽象方法以abstract關(guān)鍵字標(biāo)示出來。

            具體方法:一個(gè)具體方法由抽象類聲明并實(shí)現(xiàn),而子類并不實(shí)現(xiàn)或置換。在C#語(yǔ)言里面,一個(gè)具體方法沒有abstract關(guān)鍵字。

            鉤子方法:一個(gè)鉤子方法由抽象類聲明并實(shí)現(xiàn),而子類會(huì)加以擴(kuò)展。通常抽象類給出的實(shí)現(xiàn)是一個(gè)空實(shí)現(xiàn),作為方法的默認(rèn)實(shí)現(xiàn)。(Visual FoxPro中項(xiàng)目向?qū)Ы⒌捻?xiàng)目會(huì)使用一個(gè)AppHook類實(shí)現(xiàn)監(jiān)視項(xiàng)目成員變化,調(diào)整系統(tǒng)結(jié)構(gòu)的工作。)鉤子方法的名字通常以do開始。

            posted on 2006-01-03 16:04 夢(mèng)在天涯 閱讀(550) 評(píng)論(0)  編輯 收藏 引用 所屬分類: Design pattern

            公告

            EMail:itech001#126.com

            導(dǎo)航

            統(tǒng)計(jì)

            • 隨筆 - 461
            • 文章 - 4
            • 評(píng)論 - 746
            • 引用 - 0

            常用鏈接

            隨筆分類

            隨筆檔案

            收藏夾

            Blogs

            c#(csharp)

            C++(cpp)

            Enlish

            Forums(bbs)

            My self

            Often go

            Useful Webs

            Xml/Uml/html

            搜索

            •  

            積分與排名

            • 積分 - 1807503
            • 排名 - 5

            最新評(píng)論

            閱讀排行榜

            欧美色综合久久久久久| 久久久无码精品亚洲日韩蜜臀浪潮| 久久人人爽人人爽人人片av高请 | 69久久夜色精品国产69| 亚洲精品无码久久久久| 久久美女人爽女人爽| 久久精品国产影库免费看 | 久久精品国产亚洲AV无码娇色| 国产精品岛国久久久久| 无码8090精品久久一区| 久久精品国产第一区二区三区| 色综合久久久久网| 精品久久久中文字幕人妻| 久久婷婷久久一区二区三区| 中文字幕精品无码久久久久久3D日动漫 | 精品久久无码中文字幕| 性做久久久久久免费观看| 久久超碰97人人做人人爱| 美女久久久久久| 国产精品久久影院| 久久久久久久精品妇女99| 99热热久久这里只有精品68| 少妇久久久久久久久久| 理论片午午伦夜理片久久| 日韩欧美亚洲综合久久影院d3| 亚洲精品乱码久久久久久自慰| 欧美久久久久久精选9999| 久久国产精品一区二区| 国产成人久久精品激情| 久久99热这里只有精品66| 狠狠久久综合伊人不卡| 狠狠色丁香婷婷综合久久来来去 | 久久综合国产乱子伦精品免费| 亚洲国产精品成人久久蜜臀 | 久久国产亚洲精品无码| 国内高清久久久久久| 久久这里只有精品视频99| 久久精品国产精品青草app| 久久99精品久久久久久动态图| 久久天天躁夜夜躁狠狠| 亚洲国产香蕉人人爽成AV片久久|