<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ??一站式輕松地調用各大LLM模型接口,支持GPT4、智譜、豆包、星火、月之暗面及文生圖、文生視頻 廣告
                **定義:**組合模式(CompositePattern),將對象組合成樹形結構以表示“部分—整體”的層次結構。“Composite”使得用戶對單個對象和對組合對象的使用具有一致性。 類型:結構型模式。 類圖:![](https://box.kancloud.cn/2016-08-19_57b6b465c6e33.jpg) ![](image/d41d8cd98f00b204e9800998ecf8427e.jpg) 參與者: 1. Computer,客戶端,選擇是否添加USB設備。 1. USBDevice,所有USB設備的抽象類,提供USB設備的基本通信接口。 1. USBMouse,單個對象,沒有子部件。 1. USBHub,也即Composite組合對象,可能存在多個子部件。 適用性: ????????無論是單個對象還是組合對象,用戶都希望使用統一接口來控制,這種情況下適合組合模式。 概述: ???????組合模式給人的感覺很像樹干樹枝的結構,再一想,其實和USB拓撲結構圖也一樣(見下圖)。主機,可以看作是Client,Hub1可以看作是組合對象,包括兩個USB設備以及一個新的組合設備Hub2.![](https://box.kancloud.cn/2016-08-19_57b6b465f1d02.jpg) ![](image/d41d8cd98f00b204e9800998ecf8427e.jpg) ![](image/d41d8cd98f00b204e9800998ecf8427e.jpg) ??????無論是USB設備還是USBHub,主機都可以通過相同的命令來訪問它們。這也正是組合模式要完成的工作。即Client能夠通過相同的接口來訪問單個設備和組合設備。 示例代碼: ~~~ #include <iostream> #include <list> using namespace std; // 抽象接口 class CUSBDevice { public: virtual ~CUSBDevice(){} virtual void Add(CUSBDevice* _pDev){} virtual void Remove(CUSBDevice* _pDev){} virtual void Transmit(){} virtual int GetChild(){return 0;} }; // 單一個對象,不能添加新部件 class CUSBMouse : public CUSBDevice { public: virtual void Transmit() { cout<<"傳遞鼠標移動點擊信息"<<endl; } }; // 組合對象,可以添加多個新部件 class CUSBHub : public CUSBDevice { public: virtual void Add(CUSBDevice* _pDev) { m_listDev.push_back(_pDev); } virtual void Remove(CUSBDevice* _pDev) { m_listDev.remove(_pDev); } virtual void Transmit() { cout<<"傳輸USBHub信息"<<endl; } virtual int GetChild() { return m_listDev.size(); } private: list<CUSBDevice*> m_listDev; }; ~~~ // 電腦主機先接了一個HubA,HubA再接了一個USB鼠標以及又一個USBHubB // USBHubB又接一個USB鼠標 ~~~ int _tmain(int argc, _TCHAR* argv[]) { // 先建立一個USBHub CUSBHub hubA; CUSBDevice* pUSBMA = new CUSBMouse; hubA.Add(pUSBMA); // USBHubB CUSBDevice* pUSBHubB = new CUSBHub; CUSBDevice* pUSBMB = new CUSBMouse; pUSBHubB->Add(pUSBMB); hubA.Add(pUSBHubB); // 移除設備 if (pUSBMA->GetChild() > 0) { cout<<"移除設備"<<endl; } delete pUSBMA; delete pUSBMB; delete pUSBHubB; return 0; } ~~~ **注意:**抽象基類的析構函數一定要是虛函數,否則內存釋放的時候會有問題。 **優缺點:** 1. 優點,能夠非常靈活地添加單個部件以及組合部件,不用區別對待單個對象以及組合對象。 **參考資料:** 1. 《設計模式——可復用面向對象軟件基礎》 1. 《Java與模式》 1. 《大話設計模式》
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看