• <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
            數(shù)據(jù)加載中……

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

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

            UML結構圖:


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

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

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

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

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

            實現(xiàn):
            1)Bridge.h
            /********************************************************************
            ????created:????2006/07/20
            ????filename:?????Brige.h
            ????author:????????李創(chuàng)
            ????????????????
            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;
            }
            ;

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

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

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

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

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

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

            #endif

            2)Bridge.cpp
            /********************************************************************
            ????created:????2006/07/20
            ????filename:?????Brige.cpp
            ????author:????????李創(chuàng)
            ????????????????
            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:????????李創(chuàng)
            ????????????????
            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 那誰 閱讀(3921) 評論(2)  編輯 收藏 引用 所屬分類: 設計模式

            評論

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

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

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

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

            我也是這么覺得,誰new的就讓誰delete
            2010-05-27 14:26 | dd
            97久久精品人人做人人爽| 久久久亚洲欧洲日产国码aⅴ| 精品欧美一区二区三区久久久| 香蕉久久夜色精品国产小说| 欧美日韩中文字幕久久久不卡| 亚洲精品午夜国产VA久久成人| 午夜不卡888久久| 国产精品久久久久蜜芽| 久久这里只有精品首页| 伊人久久大香线蕉精品不卡| 成人综合伊人五月婷久久| 久久久久国产一区二区| av午夜福利一片免费看久久| 性做久久久久久免费观看| 国产精品一久久香蕉国产线看| 久久影院午夜理论片无码| 好属妞这里只有精品久久| 久久99九九国产免费看小说| 99热都是精品久久久久久| 久久影院综合精品| 欧美亚洲国产精品久久高清| 九九久久精品无码专区| 久久91亚洲人成电影网站| 久久人人爽人人爽人人AV东京热 | 成人久久综合网| 人妻系列无码专区久久五月天| 国产V亚洲V天堂无码久久久| 亚洲AV无码1区2区久久 | 久久精品卫校国产小美女| 99久久国产综合精品成人影院| 97久久天天综合色天天综合色hd| 无码精品久久久天天影视| 久久久久久精品免费看SSS| 久久久久国产精品嫩草影院| 国产午夜精品久久久久九九电影| 久久久精品午夜免费不卡| 欧美一区二区精品久久| 99久久人人爽亚洲精品美女| 国产精品日韩欧美久久综合| 久久se这里只有精品| 国产ww久久久久久久久久|