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

            牽著老婆滿街逛

            嚴以律己,寬以待人. 三思而后行.
            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(適配器)-類對象結構型模式 - 設計模式


            1. 意圖

            將一個類的接口轉換成客戶希望的另外一個接口. 解決接口不兼容問題.

            2. 別名

            包裝器 Wrapper

            4. 適用性

            想使用一個已經存在的類. 而它的接口不符合你的要求.


            5. 結構

             

            6. 參與者

            Target
                ----客戶需要的接口.
            Adaptee
                ----已經存在的一個接口.這個接口需要適配.
            Adapter
                ----對Adaptee和Target接口進行適配.



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

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

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

            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的適配器。

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

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

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

            观看 国产综合久久久久鬼色 欧美 亚洲 一区二区 | 久久精品国产亚洲AV大全| 久久亚洲色一区二区三区| 亚洲国产精品狼友中文久久久| 偷偷做久久久久网站| 精品久久久久久久久午夜福利| 国产亚洲婷婷香蕉久久精品| 久久www免费人成看国产片| 久久午夜免费视频| 2020最新久久久视精品爱| 伊人久久大香线蕉成人| 潮喷大喷水系列无码久久精品| 亚洲国产天堂久久综合网站| 久久精品国产亚洲AV不卡| 热久久这里只有精品| 久久久这里有精品| 国产精品一区二区久久精品无码| 欧美精品乱码99久久蜜桃| 日本久久久精品中文字幕| 亚洲欧美伊人久久综合一区二区| 国产成人久久精品二区三区| 无码伊人66久久大杳蕉网站谷歌| 久久中文精品无码中文字幕| …久久精品99久久香蕉国产| 久久精品国产亚洲AV不卡| 欧洲性大片xxxxx久久久| 狠狠狠色丁香婷婷综合久久俺| 综合久久国产九一剧情麻豆| 亚洲国产日韩欧美综合久久| 久久99精品久久久久久野外| 久久免费精品视频| 99精品国产在热久久无毒不卡| 无码人妻久久一区二区三区蜜桃| 欧洲国产伦久久久久久久| 久久国产福利免费| 国产精品九九久久精品女同亚洲欧美日韩综合区 | 久久精品国产精品亚洲人人| 91精品无码久久久久久五月天| 69久久夜色精品国产69| 国产午夜久久影院| 久久午夜电影网|