• <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 那誰 閱讀(3916) 評論(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
            亚洲欧美精品伊人久久| 久久久久99精品成人片试看| 久久综合给合久久狠狠狠97色 | 欧美激情精品久久久久久| 久久国产精品99国产精| 亚洲欧美成人综合久久久| 久久无码AV一区二区三区| 久久久久婷婷| 7777精品伊人久久久大香线蕉| 亚洲国产成人久久综合野外| 亚洲精品久久久www| 久久精品无码一区二区WWW| 亚洲精品高清国产一线久久| 欧美丰满熟妇BBB久久久| 久久妇女高潮几次MBA| 久久久噜噜噜久久中文福利| 久久婷婷五月综合97色| 精品久久久久久| 久久精品国产亚洲5555| 久久国产亚洲精品| 久久99久久99精品免视看动漫| 青青草原1769久久免费播放| 久久久噜噜噜久久| 色婷婷综合久久久久中文| 国产精品女同久久久久电影院| 色综合合久久天天综合绕视看| 国产免费久久久久久无码| 区久久AAA片69亚洲| 国产精品久久久久国产A级| 久久久免费观成人影院| 男女久久久国产一区二区三区| 97久久精品无码一区二区天美| 久久久久国产亚洲AV麻豆| 三上悠亚久久精品| 久久精品国产亚洲Aⅴ香蕉 | 亚洲AV日韩精品久久久久久久| 国产精品一区二区久久| 久久久这里只有精品加勒比| 久久噜噜电影你懂的| 久久精品综合网| 久久久久国产一级毛片高清板|