青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

來吧,朋友!

為C++瘋狂

設計模式解析和實現(C++) Composite模式

作用:

    將對象組合成樹形結構以表示“部分-整體”的層次結構。Composite使得用戶對單個對象和組合對象的使用具有一致性。

    UML結構圖:



    抽象基類:

    1)Component:為組合中的對象聲明接口,聲明了類共有接口的缺省行為(如這里的Add,Remove,GetChild函數),聲明一個接口函數可以訪問Component的子組件。

    接口函數:

    1)Component::Operatation:定義了各個組件共有的行為接口,由各個組件的具體實現。

    2)Component::Add添加一個子組件

    3)Component::Remove::刪除一個子組件。

    4)Component::GetChild:獲得子組件的指針。

    解析:

    Component模式是為解決組件之間的遞歸組合提供了解決的辦法,它主要分為兩個派生類,其中的Leaf是葉子結點,也就是不含有子組件的結點,而Composite是含有子組件的類。舉一個例子來說明這個模式,在UI的設計中,最基本的控件是諸如Button,Edit這樣的控件,相當于是這里的Leaf組件,而比較復雜的控件比如List則可也看做是由這些基本的組件組合起來的控件,相當于這里的Composite,它們之間有一些行為含義是相同的,比如在控件上作一個點擊,移動操作等等的,這些都可以定義為抽象基類中的接口虛函數,由各個派生類去實現之,這些都會有的行為就是這里的Operation函數,而添加,刪除等進行組件組合的操作只有非葉子結點才可能有,所以虛擬基類中只是提供接口而且默認的實現是什么都不做。

實現:

    1)Composite.h

 /**//********************************************************************
    created:    2006/07/20
    filename:     Composite.h
    author:        李創
                http://www.shnenglu.com/converse/

    purpose:    Composite模式的演示代碼
*********************************************************************/

#ifndef COMPOSITE_H
#define COMPOSITE_H

#include <list>

// 組合中的抽象基類
class Component
{
public:
    Component(){}
    virtual ~Component(){}

    // 純虛函數,只提供接口,沒有默認的實現
    virtual void Operation() = 0;

    // 虛函數,提供接口,有默認的實現就是什么都不做
    virtual void Add(Component* pChild);
    virtual void Remove(Component* pChild);
    virtual Component* GetChild(int nIndex);
};

// 派生自Component,是其中的葉子組件的基類
class Leaf
    : public Component
{
public:
    Leaf(){}
    virtual ~Leaf(){}

    virtual void Operation();
};

// 派生自Component,是其中的含有子件的組件的基類
class Composite
    : public Component
{
public:
    Composite(){}
    virtual ~Composite();

    virtual void Operation();

    virtual void Add(Component* pChild);
    virtual void Remove(Component* pChild);
    virtual Component* GetChild(int nIndex);

private:
    // 采用list容器去保存子組件
    std::list<Component*>    m_ListOfComponent;
};

#endif

2)Composite.cpp

 /**//********************************************************************
    created:    2006/07/20
    filename:     Composite.cpp
    author:        李創
                http://www.shnenglu.com/converse/

    purpose:    Composite模式的演示代碼
*********************************************************************/

#include "Composite.h"
#include <iostream>
#include <algorithm>

/**//*-------------------------------------------------------------------
    Component成員函數的實現

 -------------------------------------------------------------------*/
void Component::Add(Component* pChild)
{

}

void Component::Remove(Component* pChild)
{

}

Component* Component::GetChild(int nIndex)
{
    return NULL;
}

/**//*-------------------------------------------------------------------
    Leaf成員函數的實現

-------------------------------------------------------------------*/
void Leaf::Operation()
{
    std::cout << "Operation by leafn";
}

/**//*-------------------------------------------------------------------
    Composite成員函數的實現

-------------------------------------------------------------------*/
Composite::~Composite()
{
    std::list<Component*>::iterator iter1, iter2, temp;

    for (iter1  = m_ListOfComponent.begin(), iter2 = m_ListOfComponent.end();
         iter1 != iter2;
         )
    {
        temp = iter1;
        ++iter1;
        delete (*temp);
    }
}

void Composite::Add(Component* pChild)
{
    m_ListOfComponent.push_back(pChild);
}

void Composite::Remove(Component* pChild)
{
    std::list<Component*>::iterator iter;

    iter = find(m_ListOfComponent.begin(), m_ListOfComponent.end(), pChild);

    if (m_ListOfComponent.end() != iter)
    {
        m_ListOfComponent.erase(iter);
    }
}

Component* Composite::GetChild(int nIndex)
{
    if (nIndex <= 0 || nIndex > m_ListOfComponent.size())
        return NULL;

    std::list<Component*>::iterator iter1, iter2;
    int i;
    for (i = 1, iter1  = m_ListOfComponent.begin(), iter2 = m_ListOfComponent.end();
        iter1 != iter2;
        ++iter1, ++i)
    {
        if (i == nIndex)
            break;
    }

    return *iter1;
}

void Composite::Operation()
{
    std::cout << "Operation by Compositen";

    std::list<Component*>::iterator iter1, iter2;

    for (iter1  = m_ListOfComponent.begin(), iter2 = m_ListOfComponent.end();
        iter1 != iter2;
        ++iter1)
    {
        (*iter1)->Operation();
    }
}

3)Main.cpp

 /**//********************************************************************
    created:    2006/07/20
    filename:     Main.cpp
    author:        李創
                http://www.shnenglu.com/converse/

    purpose:    Composite模式的測試代碼
*********************************************************************/

#include "Composite.h"
#include <stdlib.h>

int main()
{
    Leaf *pLeaf1 = new Leaf();
    Leaf *pLeaf2 = new Leaf();

    Composite* pComposite = new Composite;
    pComposite->Add(pLeaf1);
    pComposite->Add(pLeaf2);
    pComposite->Operation();
    pComposite->GetChild(2)->Operation();

    delete pComposite;

    system("pause");

    return 0;
}

posted on 2009-07-20 17:14 yanghaibao 閱讀(392) 評論(0)  編輯 收藏 引用 所屬分類: C++開發工具

導航

<2025年11月>
2627282930311
2345678
9101112131415
16171819202122
23242526272829
30123456

統計

常用鏈接

留言簿

隨筆分類

隨筆檔案

文章檔案

收藏夾

Good blogs

搜索

最新評論

閱讀排行榜

評論排行榜

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            欧美伊久线香蕉线新在线| 性欧美8khd高清极品| 久久免费精品日本久久中文字幕| 国产精品毛片在线| 性色av一区二区三区| 亚洲网友自拍| 国产亚洲精品bt天堂精选| 久久精品亚洲一区| 浪潮色综合久久天堂| 亚洲人成在线观看| 亚洲伦理在线| 国产美女精品一区二区三区| 久久精品午夜| 欧美搞黄网站| 午夜在线播放视频欧美| 久久狠狠婷婷| 一本一本久久a久久精品综合妖精| 日韩亚洲欧美成人| 国产女主播一区| 欧美顶级大胆免费视频| 欧美日韩国产影院| 欧美在线观看一区二区三区| 久久在线视频在线| 亚洲图片在线| 欧美主播一区二区三区美女 久久精品人 | 欧美一区二区三区免费大片| 久久国产高清| 亚洲免费久久| 久久精品国产欧美亚洲人人爽| 亚洲人线精品午夜| 亚洲欧美一区二区三区极速播放 | 老鸭窝91久久精品色噜噜导演| 在线视频欧美日韩精品| 久久精品国产亚洲5555| 中文在线资源观看网站视频免费不卡 | 激情久久久久久久| 日韩视频精品在线| 原创国产精品91| 亚洲欧美成人一区二区在线电影| 亚洲国产精品一区二区第四页av| 亚洲——在线| 日韩亚洲视频| 久久久天天操| 久久国产乱子精品免费女| 欧美日韩国产在线看| 欧美成人亚洲成人| 好吊妞这里只有精品| 亚洲色图自拍| 一区二区欧美国产| 欧美福利视频一区| 欧美成人精品激情在线观看| 国产色综合天天综合网| 一区二区国产在线观看| 日韩一二三在线视频播| 免费日韩视频| 亚洲福利视频一区| 国内偷自视频区视频综合| 亚洲一区二区三区乱码aⅴ蜜桃女 亚洲一区二区三区乱码aⅴ | 午夜日韩视频| 亚洲欧美视频一区| 欧美色一级片| 9久草视频在线视频精品| 亚洲看片网站| 欧美精品日韩精品| 亚洲人成高清| 一区二区激情视频| 欧美日韩精品| 亚洲图片激情小说| 午夜免费电影一区在线观看| 国产精品sm| 亚洲一区久久久| 欧美一区二区三区免费在线看 | 欧美伦理91| 亚洲免费高清| 欧美亚洲视频在线观看| 国产日本精品| 久久9热精品视频| 女生裸体视频一区二区三区| 亚洲国产精品成人综合| 欧美mv日韩mv国产网站app| 亚洲国产欧美日韩精品| 亚洲作爱视频| 国产精品成人v| 先锋影音国产一区| 久久在线91| 日韩一区二区久久| 国产精品免费网站| 久久久久国内| 亚洲精品综合在线| 欧美在线播放高清精品| 精品成人国产| 欧美日韩亚洲另类| 亚洲欧美激情视频| 男男成人高潮片免费网站| 亚洲免费电影在线观看| 国产精品社区| 男女av一区三区二区色多| 日韩一二在线观看| 久久九九精品99国产精品| 亚洲精品久久久久中文字幕欢迎你 | 欧美亚洲自偷自偷| 亚洲丰满少妇videoshd| 欧美夜福利tv在线| 亚洲国产高清一区| 国产精品一卡二| 久久影院午夜片一区| 夜夜嗨av一区二区三区中文字幕| 久久久久高清| 亚洲一区精品在线| 亚洲国产福利在线| 国产欧美一区二区三区久久| 免费人成精品欧美精品| 欧美一级黄色录像| 99精品久久免费看蜜臀剧情介绍| 老色鬼久久亚洲一区二区 | 亚洲国产精品一区制服丝袜| 国产精品狠色婷| 欧美成人午夜剧场免费观看| 欧美在线国产| 亚洲亚洲精品三区日韩精品在线视频 | 久久成人精品无人区| 99成人在线| 亚洲国产精品一区| 久久婷婷影院| 久久国产精品亚洲va麻豆| 亚洲综合不卡| 一二三四社区欧美黄| 亚洲福利久久| 在线精品福利| 狠狠久久婷婷| 国内精品国产成人| 国产精品一区二区三区观看| 欧美日韩免费在线| 欧美日韩国产精品成人| 久久综合色婷婷| 久久午夜精品| 久久久久久久综合色一本| 午夜精品影院在线观看| 亚洲视频在线看| av成人免费观看| 这里只有精品视频| 99国产精品久久久久久久久久| 亚洲三级电影在线观看| 亚洲激情视频网| 亚洲精品国精品久久99热| 亚洲精品国产视频| 亚洲品质自拍| 91久久精品国产91性色tv| 欧美大片一区二区三区| 麻豆国产精品va在线观看不卡 | 在线欧美日韩| 亚洲成色最大综合在线| 亚洲国产福利在线| 亚洲每日更新| 亚洲一级免费视频| 亚洲欧美一区二区精品久久久| 亚洲摸下面视频| 性刺激综合网| 久久久久欧美精品| 久久久一区二区三区| 久久综合色综合88| 欧美黄色aa电影| 99riav久久精品riav| 亚洲网站啪啪| 久久国产主播精品| 欧美大片免费观看在线观看网站推荐| 欧美a一区二区| 欧美私人网站| 国产视频亚洲精品| 亚洲韩国日本中文字幕| 一区二区三区国产精华| 亚洲摸下面视频| 美国成人毛片| 亚洲日本黄色| 午夜国产精品视频| 另类亚洲自拍| 国产精品成人免费| 黄色一区二区三区四区| 99亚洲伊人久久精品影院红桃| 午夜精品理论片| 欧美黄色影院| 亚洲影院在线观看| 久久久综合网| 国产精品国色综合久久| 在线看成人片| 午夜精品久久久久久| 麻豆久久精品| 亚洲专区一区| 欧美精品成人| 激情综合激情| 亚洲一区二区三区涩| 欧美高清视频www夜色资源网| 一区二区日韩伦理片| 久久漫画官网| 国产精品欧美精品| 一本色道久久综合一区 | 欧美亚洲午夜视频在线观看| 欧美国产在线观看| 欧美一级片一区| 国产精品久久久|