• <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久久久香蕉| 无码国内精品久久综合88| 久久久久久精品久久久久| 国产精品久久网| 久久人妻少妇嫩草AV蜜桃| 久久99国内精品自在现线| 91精品国产91久久久久久| 久久天天躁狠狠躁夜夜不卡| 成人妇女免费播放久久久| 久久久久久久久久久免费精品| 国产欧美久久久精品影院| 97久久国产亚洲精品超碰热| 亚洲国产成人久久综合野外| 国内精品久久久久久99蜜桃| 免费无码国产欧美久久18| 99久久精品免费看国产免费| 日韩av无码久久精品免费| 久久国产福利免费| 嫩草影院久久99| 精品综合久久久久久888蜜芽| 精品久久久久久久国产潘金莲 | 77777亚洲午夜久久多喷| 草草久久久无码国产专区| 久久久久人妻一区精品色| 国产精品久久久香蕉| 久久国产免费直播| 国产免费久久精品99久久| 7国产欧美日韩综合天堂中文久久久久| 亚洲中文久久精品无码| 国产精品久久久久免费a∨| 色天使久久综合网天天| 少妇被又大又粗又爽毛片久久黑人| 久久国产高清一区二区三区| 精品久久久久久无码人妻热| 中文字幕亚洲综合久久| 欧美精品一区二区精品久久| 日本久久久精品中文字幕| 久久无码av三级| 久久亚洲AV无码西西人体| 色天使久久综合网天天|