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

            一步一步實現(xiàn)自己的模擬控件(7)——可擴展布局子控件

             

            可擴展:

            要使得我們的控件具備一定的可擴展性,那么必定會產(chǎn)生控件之外的對象作為擴展,并且這個對象對于控件來說是可插入可移除的。用于擴展的對象和控件之間應(yīng)該具備一定的關(guān)系,例如:1-1,1-n,n-n等。我們將這樣的對象關(guān)系抽象了出來,稱之為對象關(guān)系。

            對象關(guān)系:

            一個對象可能允許單個對象對其進行關(guān)聯(lián),也可能允許多個對象對其進行關(guān)聯(lián),甚至可能即允許多個對象進行關(guān)聯(lián),但卻對某些類型的對象限制為只能單個的對其進行關(guān)聯(lián)。我們將這些對象抽象為:單對象關(guān)系, 多對象關(guān)系,獨占式對象關(guān)系(這是對多對象關(guān)系的一種擴展)。

            class ObjectRelationship{
            protected:
            ObjectRelationship(){}

            public:
            virtual ~ObjectRelationship(){}

            private:
            ObjectRelationship(
            const ObjectRelationship&);
            ObjectRelationship
            & operator =(const ObjectRelationship&);

            public:
            bool CreateRelationship(ObjectRelationship* pObject)
            {
            if (!DoCreateRelationship_(pObject))
            {
            return false;
            }
            RelationshipCreated_(pObject);
            return true;
            }
            bool DestroyRelationship(ObjectRelationship* pObject)
            {
            if (!DoDestroyRelationship_(pObject))
            {
            return false;
            }
            RelationshipDestroyed_(pObject);
            return true;
            }

            protected:
            virtual bool DoCreateRelationship_(ObjectRelationship* /*pObject*/) = 0;
            virtual bool DoDestroyRelationship_(ObjectRelationship* /*pObject*/) = 0;

            protected:
            virtual void RelationshipCreated_(ObjectRelationship* /*pObject*/){}
            virtual void RelationshipDestroyed_(ObjectRelationship* /*pObject*/){}
            };

             

            這是對象關(guān)系基類,接口只有兩個:建立關(guān)系,銷毀關(guān)系。

            單對象關(guān)系, 多對象關(guān)系都派生于這個基類,而獨占式對象關(guān)系是實現(xiàn)的兩個幫助函數(shù)來輔助多對象關(guān)系。我們的Widget派生于多對象關(guān)系,它便具備了和多個對象建立關(guān)系的能力(我們將有不同的擴展關(guān)聯(lián)到Widget)。為了便于管理和擴展,我們將所有和Widget關(guān)聯(lián)的擴展放到一個對象當(dāng)中進行管理,Widget和擴展之間的關(guān)系建立和銷毀都委托這個對象來進行。

            class LayoutChildren;

            typedef std::
            set<LayoutChildren*> LayoutChildrenSet;

            class RelatedObject{
            Widget
            * pWidget_; // 控件

            // 控件所關(guān)聯(lián)的對象
            LayoutChildrenSet layoutChildrens_; // 可以有多個布局管理管理不同的子控件布局

            private:
            friend
            class Widget;
            explicit RelatedObject(Widget* const pWidget);

            public: // 獲取關(guān)聯(lián)對象的接口
            const LayoutChildrenSet& GetLayoutChildrens() const{return layoutChildrens_;}

            private:
            void RelationshipCreated_(ObjectRelationship* pObject);
            void RelationshipDestroyed_(ObjectRelationship* pObject);
            };

             

            void Widget::RelationshipCreated_(ObjectRelationship* pObject)
            {
            GetRelatedObject()
            ->RelationshipCreated_(pObject);
            }
            void Widget::RelationshipDestroyed_(ObjectRelationship* pObject)
            {
            GetRelatedObject()
            ->RelationshipDestroyed_(pObject);
            }

             

            布局子控件:

            我們?yōu)閃idgt添加了一個布局子控件的接口,當(dāng)控件自身區(qū)域變化的時候會自動的調(diào)用這個接口,當(dāng)然用戶也可以隨時調(diào)用此接口對子控件進行布局。此接口負(fù)責(zé)將操作傳遞給擴展,我們考慮到子控件的布局策略可能會各有不同,因此我們能夠關(guān)聯(lián)多個布局子控件擴展到Widget,這使得我們能夠以不同的布局策略來區(qū)別對待不同的子控件。

            void Widget::LayoutChildren()
            {
            auto pRelatedObject
            = GetRelatedObject();
            if (pRelatedObject)
            {
            const widget::LayoutChildrenSet& layoutChildrens = pRelatedObject->GetLayoutChildrens();
            std::for_each(
            layoutChildrens.begin(), layoutChildrens.end(),
            std::bind(std::mem_fn(
            &widget::LayoutChildren::Layout), std::placeholders::_1, this));
            }
            }

             

            我們創(chuàng)建了一個邊緣式布局自控件擴展進行測試,測試效果在測試工程中能夠看到。

            下載測試工程源碼

            作者: Evil.Ghost 發(fā)表于 2011-04-12 21:17 原文鏈接

            評論: 0 查看評論 發(fā)表評論


            最新新聞:
            · 消息稱iPad 3仍不采用Retina屏幕(2011-04-12 20:29)
            · nginx 1.0.0發(fā)布(2011-04-12 20:27)
            · 2011Mozilla開發(fā)者大會亮點搶先看(2011-04-12 20:24)
            · 亞馬遜成谷歌第一大廣告主 每年2億美元(圖)(2011-04-12 20:16)
            · 九城OpenFeint中國首秀:與聯(lián)通推手游(2011-04-12 20:13)

            編輯推薦:體驗Managed Extensibility Framework精妙的設(shè)計

            網(wǎng)站導(dǎo)航:博客園首頁  我的園子  新聞  閃存  小組  博問  知識庫

            posted on 2011-04-12 21:17 EvilGhost 閱讀(1277) 評論(0)  編輯 收藏 引用


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


            導(dǎo)航

            統(tǒng)計

            常用鏈接

            留言簿

            隨筆檔案(12)

            文章檔案(1)

            最新隨筆

            搜索

            積分與排名

            最新隨筆

            最新評論

            閱讀排行榜

            評論排行榜

            伊人久久综合精品无码AV专区| 午夜视频久久久久一区 | 99久久人妻无码精品系列蜜桃| 伊人久久免费视频| 久久棈精品久久久久久噜噜| 久久久久久九九99精品| 91超碰碰碰碰久久久久久综合| 久久久久九国产精品| 日韩欧美亚洲综合久久影院Ds| 亚洲中文久久精品无码| 久久av无码专区亚洲av桃花岛| 91精品国产高清91久久久久久| 99国产欧美精品久久久蜜芽 | 久久国产成人午夜AV影院| 久久综合偷偷噜噜噜色| 久久99热只有频精品8| 亚洲欧美一级久久精品| 久久精品国产清高在天天线| 久久99热这里只有精品国产| 亚洲国产另类久久久精品| 狠狠色综合网站久久久久久久| 久久精品国产久精国产思思| 国产AⅤ精品一区二区三区久久| 婷婷久久香蕉五月综合加勒比| 91精品无码久久久久久五月天| 欧美亚洲国产精品久久| 波多野结衣中文字幕久久| 久久亚洲AV成人无码| 久久91精品综合国产首页| 久久99国产综合精品| 一本色道久久88精品综合| 久久嫩草影院免费看夜色| 99久久精品这里只有精品| AAA级久久久精品无码片| 人妻无码久久一区二区三区免费| 国产香蕉久久精品综合网| 青青草国产精品久久久久| 久久99中文字幕久久| 国产精品久久久久无码av| 国内精品久久久久久久97牛牛| 精品无码久久久久国产|