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

            The Programming world of Alex

            設(shè)計(jì)模式之Strategy模式

            Strategy模式是設(shè)計(jì)模式中非常常用的一種設(shè)計(jì)模式,甚至在你沒(méi)有學(xué)習(xí)過(guò)設(shè)計(jì)模式之前就已經(jīng)使用過(guò)這種模式。先看個(gè)簡(jiǎn)單的例子吧:
            比如說(shuō)你要寫(xiě)個(gè)List的容器,需要有一個(gè)Sort方法。但是對(duì)于容器中不同類(lèi)型的對(duì)象Sort方法可能會(huì)不一樣,比如說(shuō)Point類(lèi)型可能根據(jù)point到原點(diǎn)的距離或者point的xy之和來(lái)比較大小。
            一種很自然的想法就是:
            1void sort()
            2{
            3  //按到原點(diǎn)距離排序
            4  if()
            5  {}
            6  //按XY之和大小排序
            7  else if()
            8  {}
            9}
            但是說(shuō)不定哪天Boss說(shuō):“我要按X的大小排序,你把Sort重寫(xiě)一下”,這難道不是讓人抓狂?

            好在我們有Stratregy模式能搞定這類(lèi)變化問(wèn)題(設(shè)計(jì)模式的根本目的就是在于抑制變化對(duì)程序的影響)

            動(dòng)機(jī):
            軟件構(gòu)建中,某些對(duì)象使用的算法可能多種多樣,我們需要的是將算法和對(duì)象本身解耦,在運(yùn)行時(shí)根據(jù)需要透明地更改對(duì)象的算法。

            意圖:
            定義一系列的算法,把他們一個(gè)個(gè)封裝起來(lái),并且使他們可以相互替換。該模式使得算法可以獨(dú)立于它的客戶(hù)而變化。(GoF23)

            設(shè)計(jì)思路:
            我們的目的是讓Context能在各種Algorithm之間切換,如下圖:


            上圖就是設(shè)計(jì)Sort時(shí)所用的最容易想到的方法,Context和三種Algorithm之間是緊耦合關(guān)系,對(duì)于需求的變化無(wú)能為力。

            下圖仍然運(yùn)用的是OO中的“依賴(lài)倒置原則”,使用接口將算法和對(duì)象解耦,抽象出描述算法功能要求的IStrategy接口。這樣Context和IStrategy成為相對(duì)穩(wěn)定的松耦合關(guān)系,運(yùn)行時(shí)多態(tài)來(lái)控制到底運(yùn)用何種算法來(lái)解決實(shí)際問(wèn)題,而避免了if...else...的靜態(tài)控制。

            總結(jié):
            1.“依賴(lài)倒置原則”,抽象出接口,使得Context“間接”依賴(lài)算法,兩者由緊耦合變?yōu)樗婉詈稀?br>2.對(duì)于不同的算法,分別封裝成為具體類(lèi),實(shí)現(xiàn)接口要求的功能(多態(tài)應(yīng)用)。
            3.Strategy模式簡(jiǎn)單說(shuō)就是實(shí)現(xiàn)了算法的“靜態(tài)切換”到“動(dòng)態(tài)切換”的轉(zhuǎn)變(不光是算法,其他也都可以)。大多數(shù)情況下的if...else...和switch...case...(靜態(tài)切換)都能用Strategy模式(動(dòng)態(tài)切換)來(lái)替換,這也是Strategy模式廣泛使用的原因。

            關(guān)于釋放內(nèi)存:
            非常感謝有朋友指出我代碼中存在的問(wèn)題
            主要的問(wèn)題是如何對(duì)Context中的釋放IS指針指向的內(nèi)存,具體還是看代碼中的Method函數(shù)和析構(gòu)函數(shù),如果還有問(wèn)題歡迎繼續(xù)指正 :-)
            (指針初始化賦NULL,delete后仍然賦NULL,養(yǎng)成好習(xí)慣:-))

            自己做的示例代碼,僅供參考
             1//////////////////////////////////////////////////////////////////////////
             2//StrategyTest For Strategy Pattern
             3//
             4//////////////////////////////////////////////////////////////////////////
             5
             6#include "stdafx.h"
             7#include <iostream>
             8using namespace std;
             9
            10//策略類(lèi),不同算法的抽象接口
            11class IStrategy
            12{
            13public:
            14    virtual void process()=0;
            15}
            ;
            16
            17//算法的具體實(shí)現(xiàn)
            18class StrategyA:public IStrategy
            19{
            20public:
            21    void process()
            22    {
            23        cout<<"StrategyA"<<endl;
            24    }

            25}
            ;
            26
            27class StrategyB:public IStrategy
            28{
            29public:
            30    void process()
            31    {
            32        cout<<"StrategyB"<<endl;
            33    }

            34}
            ;
            35
            36class StrategyC:public IStrategy
            37{
            38public:
            39    void process()
            40    {
            41        cout<<"StrategyC"<<endl;
            42    }

            43}
            ;
            44
            45//需要切換算法的上下文類(lèi)
            46class Context
            47{
            48private:
            49    IStrategy* IS;
            50public:
            51    //構(gòu)造函數(shù)
            52    Context()
            53    {
            54        IS = NULL;
            55    }

            56    //使用不同類(lèi)型的算法
            57    void method(IStrategy *IS)
            58    {
            59        //首先檢查指針是否為空,不為空則釋放指針
            60        if ((this->IS) != NULL) 
            61        
            62            delete (this->IS); 
            63            this->IS = NULL;
            64        }

            65        //對(duì)指針賦值
            66        this->IS = IS;
            67        //////////////////////////////////////////////////////////////////////////
            68        //一些操作
            69        //////////////////////////////////////////////////////////////////////////
            70
            71        //調(diào)用算法
            72        this->IS->process();
            73    }

            74    //析構(gòu)函數(shù),釋放指針
            75    ~Context()
            76    {
            77        if (this->IS != NULL) { delete this->IS; }
            78    }

            79}
            ;
            80
            81int _tmain(int argc, _TCHAR* argv[])
            82{
            83    Context* context = new Context();
            84
            85    //Context使用算法A
            86    cout<<"Context use the AlgorithmA:              "<<endl;
            87    context->method(new StrategyA());
            88
            89    //Context使用算法B
            90    cout<<"Context use the AlgorithmB:              "<<endl;
            91    context->method(new StrategyB());
            92
            93    //Context使用算法C
            94    cout<<"Context use the AlgorithmC:              "<<endl;
            95    context->method(new StrategyC());
            96
            97    return 0;
            98}

            posted on 2009-04-06 15:21 Alex@VCC 閱讀(3156) 評(píng)論(7)  編輯 收藏 引用 所屬分類(lèi): 設(shè)計(jì)模式

            評(píng)論

            # re: 設(shè)計(jì)模式之Strategy模式 2009-04-06 18:51 lfly

            第一次看Strategy模式的解釋?zhuān)x謝博主的說(shuō)明。感覺(jué)就是使用了虛函數(shù)的運(yùn)行時(shí)動(dòng)態(tài)綁定的特性吧?  回復(fù)  更多評(píng)論   

            # re: 設(shè)計(jì)模式之Strategy模式[未登錄](méi) 2009-04-06 18:52 Alex@VCC

            @lfly
            恩,基本就是這樣子的:)  回復(fù)  更多評(píng)論   

            # re: 設(shè)計(jì)模式之Strategy模式 2009-04-07 09:46 星綻紫輝

            nice.  回復(fù)  更多評(píng)論   

            # re: 設(shè)計(jì)模式之Strategy模式[未登錄](méi) 2009-04-07 12:03 jcily

            感謝分享,比看書(shū)理解的快。  回復(fù)  更多評(píng)論   

            # re: 設(shè)計(jì)模式之Strategy模式 2009-04-09 23:10 Kim

            我發(fā)現(xiàn)博主很喜歡用NEW來(lái)構(gòu)建對(duì)象哦。。但之后卻沒(méi)用DELETE來(lái)釋放內(nèi)存。。這不是JAVA。。C++沒(méi)垃圾回收機(jī)制。。。  回復(fù)  更多評(píng)論   

            # re: 設(shè)計(jì)模式之Strategy模式 2009-04-10 13:15 Alex@VCC

            @Kim
            非常感謝提醒,釋放內(nèi)存十分重要,我確實(shí)是忽略了這個(gè)問(wèn)題
            最近太忙,有時(shí)間會(huì)把Delete的使用集成到這些模式里去
              回復(fù)  更多評(píng)論   

            # re: 設(shè)計(jì)模式之Strategy模式 2010-11-16 10:56 rain

            @Alex@VCC
            LZ 的UML圖好像畫(huà)錯(cuò)了哦!  回復(fù)  更多評(píng)論   

            <2010年11月>
            31123456
            78910111213
            14151617181920
            21222324252627
            2829301234
            567891011

            導(dǎo)航

            統(tǒng)計(jì)

            常用鏈接

            留言簿(5)

            隨筆分類(lèi)

            隨筆檔案

            搜索

            最新評(píng)論

            閱讀排行榜

            評(píng)論排行榜

            久久香蕉国产线看观看99| 国产亚州精品女人久久久久久| 久久伊人亚洲AV无码网站| 久久久久女教师免费一区| 亚洲欧美成人久久综合中文网 | 国产精品无码久久久久久| 国内精品久久人妻互换| 久久国产高清一区二区三区| 伊人色综合九久久天天蜜桃| 久久久久亚洲AV成人片| 99久久精品国产综合一区| 久久久久精品国产亚洲AV无码| 97久久久久人妻精品专区| 久久国产成人午夜aⅴ影院| 韩国免费A级毛片久久| 久久久这里只有精品加勒比| 久久久精品国产sm调教网站 | 亚洲?V乱码久久精品蜜桃| 久久久久久亚洲Av无码精品专口| 精品久久久久久无码中文野结衣| 中文精品久久久久人妻不卡| 久久精品国产精品亚洲下载| av国内精品久久久久影院| 久久婷婷五月综合国产尤物app| 91精品国产91久久| 久久精品国产亚洲av高清漫画| 97视频久久久| 亚洲国产天堂久久综合网站| 色悠久久久久久久综合网| 久久99精品国产麻豆婷婷| 色欲久久久天天天综合网精品| 中文字幕无码av激情不卡久久| 成人亚洲欧美久久久久| 亚洲成色999久久网站| 国产精品久久久久久久久鸭| 亚洲精品无码久久久久| 久久久久se色偷偷亚洲精品av| 亚洲伊人久久综合中文成人网| 日韩AV毛片精品久久久| 久久黄视频| 日日狠狠久久偷偷色综合96蜜桃|