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

            牽著老婆滿街逛

            嚴(yán)以律己,寬以待人. 三思而后行.
            GMail/GTalk: yanglinbo#google.com;
            MSN/Email: tx7do#yahoo.com.cn;
            QQ: 3 0 3 3 9 6 9 2 0 .

            Adapter(適配器)模式

            4.1 Adapter(適配器)-類對(duì)象結(jié)構(gòu)型模式 - 設(shè)計(jì)模式


            1. 意圖

            將一個(gè)類的接口轉(zhuǎn)換成客戶希望的另外一個(gè)接口. 解決接口不兼容問(wèn)題.

            2. 別名

            包裝器 Wrapper

            4. 適用性

            想使用一個(gè)已經(jīng)存在的類. 而它的接口不符合你的要求.


            5. 結(jié)構(gòu)

             

            6. 參與者

            Target
                ----客戶需要的接口.
            Adaptee
                ----已經(jīng)存在的一個(gè)接口.這個(gè)接口需要適配.
            Adapter
                ----對(duì)Adaptee和Target接口進(jìn)行適配.



            在這里加入我們有一個(gè)接口:
            class IRunnable
            {
            public:
                IRunnable()
            {;}
                
            virtual ~IRunnable(){;}

                
            virtual void run() = 0;
            }
            ;
            一般來(lái)說(shuō),這個(gè)接口是用于線程上的。
            比如:
            IRunnable r;
            Thread thr;
            thr.Start(
            &r);

            線程的入口函數(shù)會(huì)運(yùn)行IRunnable::run()方法。
            在這里,我們要被線程運(yùn)行就必須要從IRunnable這個(gè)接口繼承下來(lái),可是,現(xiàn)在我有一個(gè)類它本來(lái)是沒(méi)有被設(shè)計(jì)為為多線程的,所以,我沒(méi)有從IRunnable繼承下來(lái)。可是現(xiàn)在,我需要它支持多線程,而且我已經(jīng)不能讓它從IRunnable繼承下來(lái)了,或者是我不想修改它,這又如何是好呢?
            這時(shí)候,我們就需要一個(gè)適配器了!

            template <class C>
            class RunnableAdapter: public IRunnable
            {
            public:
                typedef 
            void (C::*Callback)();
                
                RunnableAdapter(C
            & object, Callback method): _pObject(&object), _method(method)
                
            {
                }

                
                RunnableAdapter(
            const RunnableAdapter& ra): _pObject(ra._pObject), _method(ra._method)
                
            {
                }


                
            ~RunnableAdapter()
                
            {
                }


                RunnableAdapter
            & operator = (const RunnableAdapter& ra)
                
            {
                    _pObject 
            = ra._pObject;
                    _method  
            = ra._method;
                    
            return *this;
                }


                
            void run()
                
            {
                    (_pObject
            ->*_method)();
                }

                
            private:
                RunnableAdapter();

                C
            *       _pObject;
                Callback _method;
            }
            ;

            上面便是IRunnable的適配器。

            現(xiàn)在好了,我們可以讓不是從Runnable繼承下來(lái)的類支持多線程了:
            RunnableAdapter<MyClass> ra(myObject, &MyObject::doSomething));

            Thread thr;
            thr.Start(ra);
            Hmmm,現(xiàn)在一切都OK了!

            posted on 2008-05-04 14:00 楊粼波 閱讀(548) 評(píng)論(0)  編輯 收藏 引用


            只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。
            網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問(wèn)   Chat2DB   管理


            老色鬼久久亚洲AV综合| 2021国内久久精品| 日本精品久久久中文字幕| 狠狠干狠狠久久| 国产精品一区二区久久精品无码 | 中文成人无码精品久久久不卡 | 欧美麻豆久久久久久中文| 久久国产精品视频| 久久免费看黄a级毛片| 久久精品国产亚洲av水果派| 秋霞久久国产精品电影院| 久久精品国产只有精品66| 久久精品人妻中文系列| 久久精品国产亚洲AV无码麻豆| 亚洲伊人久久大香线蕉苏妲己| 婷婷久久综合九色综合绿巨人| 亚洲AV乱码久久精品蜜桃| 99精品久久久久久久婷婷| 久久精品国产亚洲αv忘忧草| 97久久综合精品久久久综合| 九九久久精品国产| 欧美丰满熟妇BBB久久久| 国产视频久久| 精品蜜臀久久久久99网站| 久久综合久久鬼色| 一本大道久久a久久精品综合| 婷婷久久五月天| 93精91精品国产综合久久香蕉| 一本色道久久综合亚洲精品| 91精品婷婷国产综合久久| 一本色道久久综合狠狠躁| 久久久久国产一区二区| www.久久热.com| 亚洲精品美女久久久久99| 久久影视综合亚洲| 亚洲国产精品久久久久久| 久久久久亚洲AV片无码下载蜜桃| 亚洲中文字幕伊人久久无码| 日本福利片国产午夜久久| 久久99精品国产自在现线小黄鸭| 国产精品乱码久久久久久软件 |