• <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://www.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://www.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://www.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 那誰 閱讀(3921) 評論(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
            亚洲精品视频久久久| 久久久噜噜噜久久熟女AA片| 66精品综合久久久久久久| 日本久久久精品中文字幕| 久久久人妻精品无码一区| 国产精品中文久久久久久久| 久久国产乱子伦免费精品| 国产精品免费看久久久香蕉| 亚洲国产小视频精品久久久三级| 久久综合亚洲色HEZYO社区| 99精品国产在热久久| 伊人久久精品影院| 91超碰碰碰碰久久久久久综合| 国产精品久久久久a影院| 狠狠综合久久综合中文88| 久久亚洲AV成人无码电影| 中文字幕精品久久久久人妻| 四虎国产精品免费久久5151| 久久这里只精品99re66| 国产激情久久久久影院老熟女| 亚洲国产精品无码久久| 免费一级做a爰片久久毛片潮| 97精品伊人久久大香线蕉app| 99久久国产精品免费一区二区| 久久久久香蕉视频| 久久久久综合国产欧美一区二区| 久久精品国产亚洲AV无码麻豆| 久久精品国产亚洲av麻豆蜜芽 | 久久亚洲私人国产精品| 亚洲天堂久久久| 久久青青国产| 婷婷久久精品国产| 日韩AV毛片精品久久久| 久久er国产精品免费观看8| 成人午夜精品久久久久久久小说| 成人妇女免费播放久久久| 欧洲人妻丰满av无码久久不卡| 伊人久久大香线蕉av一区| 精品久久久久久久国产潘金莲| 久久精品国产久精国产果冻传媒| 色综合久久夜色精品国产|