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

            積木

            No sub title

              C++博客 :: 首頁 :: 聯系 :: 聚合  :: 管理
              140 Posts :: 1 Stories :: 11 Comments :: 0 Trackbacks

            常用鏈接

            留言簿(1)

            我參與的團隊

            搜索

            •  

            最新評論

            閱讀排行榜

            評論排行榜

            轉載自:http://patmusing.blog.163.com/blog/static/1358349602010150231168/

            在一個方法中定義一個算法的框架,并將該算法的某些步驟,延遲到子類實現。Template Method使得子類可以重新定義一個算法中的某些特定的步驟,而無需改變整個算法的結構。

            “Define the skeleton of an algorithm in an operation, deferring some steps to subclasses. Template Method lets subclasses redefine certain steps of an algorithm without changing the algorithm’s structure.” - GoF

            換言之,Template Method提供一個方法,以允許子類重寫該方法的一部分,而無需重寫整個子類。

            比如,對于某一項任務,如果它有一個復雜的成員函數,并且該成員函數可以分成幾個步驟,同時這幾個步驟構成成員函數的整體結構式穩定的,但各個子步驟卻有很多改變的需求,這樣的情形下就特別適合使用Template MethodTemplate Method設計模式就是在確定穩定的成員函數組成結構的前提下,應對各個子步驟的變化。

            Template Method模式之UML類圖:

            25. C++實現Behavioral - Template Method模式 - 玄機逸士 - 玄機逸士博客

            業務示例:

            測試各種不同的小汽車。

            //TemplateMethod.h

            #include <iostream>

            using namespace std;

            class TestVehicle

            {

            public:

            void test() // 測試。這就是Template Method。它一共由6個步驟按照一定的時間

            { // 順序組成,但各個步驟的實現被延遲到TestVehicle的子類

            cout << "Start to test...." << endl; // 模擬固定部分的代碼

            start_up(); // 啟動

            blow_horn(); // 按喇叭

            run(); // 行駛

            turn(); // 轉彎

            brake(); // 剎車

            stop(); // 停車

            cout << "Test finished..." << endl; // 模擬固定部分的代碼

            }

            virtual ~TestVehicle()

            {

            cout << "in the destructor of TestVehicle..." << endl;

            }

            protected:

            virtual void start_up() = 0;

            virtual void blow_horn() = 0;

            virtual void run() = 0;

            virtual void turn() = 0;

            virtual void brake() = 0;

            virtual void stop() = 0;

            };

            // 測試帕沙特

            class TestPassat : public TestVehicle

            {

            public:

            ~TestPassat()

            {

            cout << "in the destructor of TestPassat..." << endl;

            }

            protected:

            void start_up()

            {

            cout << "--- Passat:\tstart up ---" << endl; // 模擬啟動Passat

            }

            void blow_horn()

            {

            cout << "--- Passat:\tblow the horn ---" << endl; // 模擬按Passat的喇叭

            }

            void run()

            {

            cout << "--- Passat:\trun ---" << endl; // 模擬Passat行駛

            }

            void turn()

            {

            cout << "--- Passat:\ttrun ---" << endl; // 模擬Passat轉彎

            }

            void brake()

            {

            cout << "--- Passat:\tbrake ---" << endl; // 模擬Passat剎車

            }

            void stop()

            {

            cout << "--- Passat:\tstop ---" << endl; // 模擬Passat停車

            }

            };

            // 測試捷達

            class TestJetta : public TestVehicle

            {

            public:

            ~TestJetta()

            {

            cout << "in the destructor of TestJetta..." << endl;

            }

            protected:

            void start_up()

            {

            cout << "--- Jetta:\tstart up ---" << endl; // 模擬按Jetta的喇叭

            }

            void blow_horn()

            {

            cout << "--- Jetta:\tblow the horn ---" << endl; // 模擬按Jetta的喇叭

            }

            void run()

            {

            cout << "--- Jetta:\trun ---" << endl; // 模擬Jetta行駛

            }

            void turn()

            {

            cout << "--- Jetta:\ttrun ---" << endl; // 模擬Jetta轉彎

            }

            void brake()

            {

            cout << "--- Jetta:\tbrake ---" << endl; // 模擬Jetta剎車

            }

            void stop()

            {

            cout << "--- Jetta:\tstop ---" << endl; // 模擬Jetta停車

            }

            };

            // TemplateMethod.cpp

            #include "TemplateMethod.h"

            int main(int argc, char** argv)

            {

            // 測試帕沙特

            TestVehicle *tvPassat = new TestPassat();

            tvPassat->test();

            cout << "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~" << endl;

            // 測試捷達

            TestVehicle *tvJetta = new TestJetta();

            tvJetta->test();

            cout << "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~" << endl;

            delete tvPassat;

            delete tvJetta;

            return 0;

            }

            運行結果:

            Start to test....

            --- Passat: start up ---

            --- Passat: blow the horn ---

            --- Passat: run ---

            --- Passat: trun ---

            --- Passat: brake ---

            --- Passat: stop ---

            Test finished...

            ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

            Start to test....

            --- Jetta: start up ---

            --- Jetta: blow the horn ---

            --- Jetta: run ---

            --- Jetta: trun ---

            --- Jetta: brake ---

            --- Jetta: stop ---

            Test finished...

            ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

            in the destructor of TestPassat...

            in the destructor of TestVehicle...

            in the destructor of TestJetta...

            in the destructor of TestVehicle...

            上述程序的UML類圖:

            25. C++實現Behavioral - Template Method模式 - 玄機逸士 - 玄機逸士博客

            Template Method模式應該是GoF給出的23個模式中相對簡單的一個。

            posted on 2013-03-08 15:47 Jacc.Kim 閱讀(218) 評論(0)  編輯 收藏 引用 所屬分類: 設計模式
            久久99精品久久久久久久不卡| 久久亚洲私人国产精品| 久久久久中文字幕| 国产精品福利一区二区久久| 久久国产乱子精品免费女| 精品久久久久久无码人妻蜜桃| 久久99热这里只有精品国产| 亚洲?V乱码久久精品蜜桃| 欧洲人妻丰满av无码久久不卡| 久久最近最新中文字幕大全 | 国产亚洲精久久久久久无码77777| 亚洲级αV无码毛片久久精品| 精品久久久久久亚洲| 日韩美女18网站久久精品| 欧美一区二区三区久久综| 久久狠狠一本精品综合网| 亚洲午夜久久久久久久久久| 嫩草影院久久99| 三上悠亚久久精品| 噜噜噜色噜噜噜久久| 丁香狠狠色婷婷久久综合| 久久精品国产久精国产果冻传媒| 久久国产免费观看精品| 欧美牲交A欧牲交aⅴ久久| 久久最新免费视频| 亚洲精品国产成人99久久| 97久久精品午夜一区二区| 色综合久久久久综合体桃花网| 久久亚洲国产成人影院网站 | 久久精品免费大片国产大片| 无码人妻久久一区二区三区免费| 亚洲欧洲久久久精品| 久久99热这里只有精品国产| 亚洲午夜精品久久久久久人妖| 日韩精品久久久久久免费| 久久天天躁狠狠躁夜夜avapp| 久久久久一本毛久久久| 久久夜色撩人精品国产小说| 久久综合精品国产一区二区三区| 51久久夜色精品国产| 国内精品久久久久久久涩爱|