• <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>
            隨筆-4  評論-40  文章-117  trackbacks-0

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


            1. 意圖

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

            2. 別名

            包裝器 Wrapper

            4. 適用性

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


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

             

            6. 參與者

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



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

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

            線程的入口函數(shù)會運(yùn)行IRunnable::run()方法。
            在這里,我們要被線程運(yùn)行就必須要從IRunnable這個接口繼承下來,可是,現(xiàn)在我有一個類它本來是沒有被設(shè)計為為多線程的,所以,我沒有從IRunnable繼承下來。可是現(xiàn)在,我需要它支持多線程,而且我已經(jīng)不能讓它從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的適配器。

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

            Thread thr;
            thr.Start(ra);
            Hmmm,現(xiàn)在一切都OK了!
            posted on 2008-05-04 16:53 李陽 閱讀(578) 評論(0)  編輯 收藏 引用 所屬分類: C++
            麻豆精品久久精品色综合| 国产精品久久久久久久久久影院| 欧美激情精品久久久久久| 久久综合久久综合久久综合| 久久人妻少妇嫩草AV无码专区| 欧美久久久久久| 97精品国产97久久久久久免费| 一级做a爰片久久毛片免费陪| 亚洲人成网站999久久久综合| 久久亚洲AV永久无码精品| 久久久久99精品成人片牛牛影视| 久久播电影网| 中文字幕精品久久| 国内精品久久久久影院薰衣草| 亚洲AV无码久久精品成人| 久久综合狠狠综合久久| a级成人毛片久久| 久久精品亚洲乱码伦伦中文| 伊人精品久久久久7777| 久久亚洲私人国产精品| 久久精品国产99国产精品澳门| 国产日韩久久久精品影院首页| 无码人妻久久一区二区三区蜜桃| 久久精品国产免费观看| 777米奇久久最新地址| 国产精品久久久久久久午夜片| 久久精品亚洲精品国产欧美| 久久精品中文字幕一区| 久久96国产精品久久久| 无码人妻久久一区二区三区蜜桃| 区久久AAA片69亚洲 | 久久久无码精品午夜| 性做久久久久久免费观看| 久久精品人成免费| 香港aa三级久久三级老师2021国产三级精品三级在 | 久久精品国产亚洲AV蜜臀色欲| 99久久99久久久精品齐齐| 开心久久婷婷综合中文字幕| 欧美va久久久噜噜噜久久| 久久免费观看视频| 国产精品天天影视久久综合网|