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

            那誰的技術博客

            感興趣領域:高性能服務器編程,存儲,算法,Linux內核
            隨筆 - 210, 文章 - 0, 評論 - 1183, 引用 - 0
            數據加載中……

            常見設計模式的解析和實現(C++)之七-Bridge模式

            作用:
            將抽象部分與它的實現部分分離,使它們都可以獨立地變化。

            UML結構圖:


            抽象基類:
            1)Abstraction:某個抽象類,它的實現方式由Implementor完成.
            2)Implementor:實現類的抽象基類,定義了實現Abastraction的基本操作,而它的派生類實現這些接口.

            接口函數:
            1)Implementor::OperationImpl:定義了為實現Abstraction需要的基本操作,由Implementor的派生類實現之,而在Abstraction::Operation函數中根據不同的指針多態調用這個函數.

            解析:
            Bridge用于將表示和實現解耦,兩者可以獨立的變化.在Abstraction類中維護一個Implementor類指針,需要采用不同的實現方式的時候只需要傳入不同的Implementor派生類就可以了.

            Bridge的實現方式其實和Builde十分的相近,可以這么說:本質上是一樣的,只是封裝的東西不一樣罷了.兩者的實現都有如下的共同點:抽象出來一個基類,這個基類里面定義了共有的一些行為,形成接口函數(對接口編程而不是對實現編程),這個接口函數在Buildier中是BuildePart函數在Bridge中是OperationImpl函數;其次,聚合一個基類的指針,如Builder模式中Director類聚合了一個Builder基類的指針,而Brige模式中Abstraction類聚合了一個Implementor基類的指針(優先采用聚合而不是繼承);而在使用的時候,都把對這個類的使用封裝在一個函數中,在Bridge中是封裝在Director::Construct函數中,因為裝配不同部分的過程是一致的,而在Bridge模式中則是封裝在Abstraction::Operation函數中,在這個函數中調用對應的Implementor::OperationImpl函數.就兩個模式而言,Builder封裝了不同的生成組成部分的方式,而Bridge封裝了不同的實現方式.

            因此,如果以一些最基本的面向對象的設計原則來分析這些模式的實現的話,還是可以看到很多共同的地方的.

            實現:
            1)Bridge.h
            /********************************************************************
            ????created:????2006/07/20
            ????filename:?????Brige.h
            ????author:????????李創
            ????????????????
            http://m.shnenglu.com/converse/

            ????purpose:????Brige模式的演示代碼
            ********************************************************************
            */


            #ifndef?BRIDEG_H
            #define?BRIDEG_H

            class?Implementor;

            //?維護一個Implementor類的指針
            class?Abstraction
            {
            public:
            ????Abstraction(Implementor
            *?pImplementor);
            ????
            virtual?~Abstraction();

            ????
            void?Operation();

            protected:
            ????Implementor
            *?m_pImplementor;
            }
            ;

            //?為實現Abstraction定義的抽象基類,定義了實現的接口函數
            class?Implementor
            {
            public:
            ????Implementor()
            {}
            ????
            virtual?~Implementor(){}

            ????
            virtual?void?OperationImpl()?=?0;
            }
            ;

            //?繼承自Implementor,是Implementor的不同實現之一
            class?ConcreateImplementorA
            ????:?
            public?Implementor
            {
            public:
            ????ConcreateImplementorA()
            {}
            ????
            virtual?~ConcreateImplementorA(){}

            ????
            virtual?void?OperationImpl();
            }
            ;

            //?繼承自Implementor,是Implementor的不同實現之一
            class?ConcreateImplementorB
            ????:?
            public?Implementor
            {
            public:
            ????ConcreateImplementorB()
            {}
            ????
            virtual?~ConcreateImplementorB(){}

            ????
            virtual?void?OperationImpl();
            }
            ;

            #endif

            2)Bridge.cpp
            /********************************************************************
            ????created:????2006/07/20
            ????filename:?????Brige.cpp
            ????author:????????李創
            ????????????????
            http://m.shnenglu.com/converse/

            ????purpose:????Brige模式的演示代碼
            ********************************************************************
            */


            #include?
            "Brige.h"
            #include?
            <iostream>

            void?ConcreateImplementorA::OperationImpl()
            {
            ????std::cout?
            <<?"Implementation?by?ConcreateImplementorA\n";
            }


            void?ConcreateImplementorB::OperationImpl()
            {
            ????std::cout?
            <<?"Implementation?by?ConcreateImplementorB\n";
            }


            Abstraction::Abstraction(Implementor
            *?pImplementor)
            ????:?m_pImplementor(pImplementor)
            {
            }


            Abstraction::
            ~Abstraction()
            {
            ????delete?m_pImplementor;
            ????m_pImplementor?
            =?NULL;
            }


            void?Abstraction::Operation()
            {
            ????m_pImplementor
            ->OperationImpl();
            }

            3)Main.cpp
            /********************************************************************
            ????created:????2006/07/20
            ????filename:?????Main.cpp
            ????author:????????李創
            ????????????????
            http://m.shnenglu.com/converse/

            ????purpose:????Bridge模式的測試代碼
            ********************************************************************
            */


            #include?
            "Brige.h"
            #include?
            <stdlib.h>

            int?main()
            {
            ????ConcreateImplementorA?
            *pImplA?=?new?ConcreateImplementorA();
            ????Abstraction?
            *pAbstraction1?=?new?Abstraction(pImplA);
            ????pAbstraction1
            ->Operation();

            ????ConcreateImplementorB?
            *pImplB?=?new?ConcreateImplementorB();
            ????Abstraction?
            *pAbstraction2?=?new?Abstraction(pImplB);
            ????pAbstraction2
            ->Operation();

            ????delete?pAbstraction1;
            ????delete?pAbstraction2;

            ????system(
            "pause");

            ????
            return?0;
            }

            posted on 2006-07-23 21:01 那誰 閱讀(3915) 評論(2)  編輯 收藏 引用 所屬分類: 設計模式

            評論

            # re: 常見設計模式的解析和實現(C++)之七-Bridge模式   回復  更多評論   

            Abstraction::~Abstraction()
            {
            delete m_pImplementor;
            m_pImplementor = NULL;
            }

            我覺得這里不應該delete pImplementor,delete的操作應該由客戶端代碼來完成更加合理一些。
            2009-02-05 20:41 | 孤煙

            # re: 常見設計模式的解析和實現(C++)之七-Bridge模式 [未登錄]  回復  更多評論   

            我也是這么覺得,誰new的就讓誰delete
            2010-05-27 14:26 | dd
            亚洲中文字幕久久精品无码APP | 久久无码AV中文出轨人妻| 国产精品永久久久久久久久久 | 久久久久亚洲精品天堂| 狠狠狠色丁香婷婷综合久久俺| 欧美久久综合性欧美| 亚洲国产成人久久精品99 | 久久亚洲欧洲国产综合| 久久久久久伊人高潮影院| 久久青青草原精品国产| 久久精品国产精品亚洲艾草网美妙| 伊人情人综合成人久久网小说| 精品久久人妻av中文字幕| 国产精品99久久不卡| 久久久久青草线蕉综合超碰| 青青青青久久精品国产| 伊人久久精品无码av一区| 国产精品欧美久久久久无广告| 久久综合视频网| 精品久久久久国产免费 | 人妻无码αv中文字幕久久琪琪布| 2021久久精品国产99国产精品| 国产精品久久久久免费a∨| 国产精品99久久久久久人| 亚洲精品美女久久777777| 精品久久久久久无码国产| 无码国内精品久久人妻蜜桃| 亚洲精品国产综合久久一线| 国产三级精品久久| 99久久婷婷国产综合精品草原 | 久久人妻无码中文字幕| 欧美午夜A∨大片久久| 久久99热这里只有精品国产| 69久久精品无码一区二区| 精品无码久久久久久尤物| 国产人久久人人人人爽| 色欲av伊人久久大香线蕉影院| 精品国产青草久久久久福利| 一本久道久久综合狠狠躁AV| 久久久久久国产a免费观看黄色大片 | 久久精品亚洲AV久久久无码|