亚洲综合原千岁中文字幕_国产精品99久久久久久久vr_无码人妻aⅴ一区二区三区浪潮_成人h动漫精品一区二区三

主頁(yè) > 知識(shí)庫(kù) > PHP設(shè)計(jì)模式(七)組合模式Composite實(shí)例詳解【結(jié)構(gòu)型】

PHP設(shè)計(jì)模式(七)組合模式Composite實(shí)例詳解【結(jié)構(gòu)型】

熱門標(biāo)簽:南京3D地圖標(biāo)注 咸陽(yáng)電銷 正規(guī)電銷機(jī)器人系統(tǒng) 邢臺(tái)400電話辦理 南寧電話外呼系統(tǒng)線路 濟(jì)源百應(yīng)電銷機(jī)器人聯(lián)系方式 嘟嘟云外呼系統(tǒng) 辦理400電話哪家好點(diǎn) 重慶外呼電銷系統(tǒng)多少錢

本文實(shí)例講述了PHP設(shè)計(jì)模式:組合模式Composite。分享給大家供大家參考,具體如下:

1. 概述

在數(shù)據(jù)結(jié)構(gòu)里面,樹(shù)結(jié)構(gòu)是很重要,我們可以把樹(shù)的結(jié)構(gòu)應(yīng)用到設(shè)計(jì)模式里面。

例子1:就是多級(jí)樹(shù)形菜單。

例子2:文件和文件夾目錄

2.問(wèn)題

我們可以使用簡(jiǎn)單的對(duì)象組合成復(fù)雜的對(duì)象,而這個(gè)復(fù)雜對(duì)象有可以組合成更大的對(duì)象。我們可以把簡(jiǎn)單這些對(duì)象定義成類,然后定義一些容器類來(lái)存儲(chǔ)這些簡(jiǎn)單對(duì)象??蛻舳舜a必須區(qū)別對(duì)象簡(jiǎn)單對(duì)象和容器對(duì)象,而實(shí)際上大多數(shù)情況下用戶認(rèn)為它們是一樣的。對(duì)這些類區(qū)別使用,使得程序更加復(fù)雜。遞歸使用的時(shí)候跟麻煩,而我們?nèi)绾问褂眠f歸組合,使得用戶不必對(duì)這些類進(jìn)行區(qū)別呢?

3.   解決方案

        組合模式:將對(duì)象組合成樹(shù)形結(jié)構(gòu)以表示“部分-整體”的層次結(jié)構(gòu)。Composite使得用戶對(duì)單個(gè)對(duì)象和組合對(duì)象的使用具有一致性。

        有時(shí)候又叫做部分-整體模式,它使我們樹(shù)型結(jié)構(gòu)的問(wèn)題中,模糊了簡(jiǎn)單元素和復(fù)雜元素的概念,客戶程序可以向處理簡(jiǎn)單元素一樣來(lái)處理復(fù)雜元素,從而使得客戶程序與復(fù)雜元素的內(nèi)部結(jié)構(gòu)解耦。

  組合模式讓你可以優(yōu)化處理遞歸或分級(jí)數(shù)據(jù)結(jié)構(gòu)。有許多關(guān)于分級(jí)數(shù)據(jù)結(jié)構(gòu)的例子,使得組合模式非常有用武之地。關(guān)于分級(jí)數(shù)據(jù)結(jié)構(gòu)的一個(gè)普遍性的例子是你每次使用電腦時(shí)所遇到的:文件系統(tǒng)。文件系統(tǒng)由目錄和文件組成。每個(gè)目錄都可以裝內(nèi)容。目錄的內(nèi)容可以是文件,也可以是目錄。按照這種方式,計(jì)算機(jī)的文件系統(tǒng)就是以遞歸結(jié)構(gòu)來(lái)組織的。如果你想要描述這樣的數(shù)據(jù)結(jié)構(gòu),那么你可以使用組合模式Composite。

4.  組合模式的分類

1)    將管理子元素的方法定義在Composite類中
2)    將管理子元素的方法定義在Component接口中,這樣Leaf類就需要對(duì)這些方法空實(shí)現(xiàn)。

5. 適用性

以下情況下適用Composite模式:

1).你想表示對(duì)象的部分-整體層次結(jié)構(gòu)

2).你希望用戶忽略組合對(duì)象與單個(gè)對(duì)象的不同,用戶將統(tǒng)一地使用組合結(jié)構(gòu)中的所有對(duì)象。

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

典型的Composite對(duì)象結(jié)構(gòu)如下圖所示:

7. 構(gòu)建模式的組成

          抽象構(gòu)件角色(component):是組合中的對(duì)象聲明接口,在適當(dāng)?shù)那闆r下,實(shí)現(xiàn)所有類共有接口的默認(rèn)行為。聲明一個(gè)接口用于訪問(wèn)和管理Component子部件。

          這個(gè)接口可  以用來(lái)管理所有的子對(duì)象。(可選)在遞歸結(jié)構(gòu)中定義一個(gè)接口,用于訪問(wèn)一個(gè)父部件,并在合適的情況下實(shí)現(xiàn)它。  

          樹(shù)葉構(gòu)件角色(Leaf):在組合樹(shù)中表示葉節(jié)點(diǎn)對(duì)象,葉節(jié)點(diǎn)沒(méi)有子節(jié)點(diǎn)。并在組合中定義圖元對(duì)象的行為。
          樹(shù)枝構(gòu)件角色(Composite):定義有子部件的那些部件的行為。存儲(chǔ)子部件。在Component接口中實(shí)現(xiàn)與子部件有關(guān)的操作。
          客戶角色(Client):通過(guò)component接口操縱組合部件的對(duì)象。   

8. 效果

     1) • 定義了包含基本對(duì)象和組合對(duì)象的類層次結(jié)構(gòu) 基本對(duì)象可以被組合成更復(fù)雜的組合對(duì)象,而這個(gè)組合對(duì)象又可以被組合,這樣不斷的遞歸下去??蛻舸a中,任何用到   基本對(duì)象的地方都可以使用組合對(duì)象。
     2) • 簡(jiǎn)化客戶代碼 客戶可以一致地使用組合結(jié)構(gòu)和單個(gè)對(duì)象。通常用戶不知道 (也不關(guān)心)處理的是一個(gè)葉節(jié)點(diǎn)還是一個(gè)組合組件。這就簡(jiǎn)化了客戶代碼 , 因?yàn)樵诙x組合的那些類中不需要寫(xiě)一些充斥著選擇語(yǔ)句的函數(shù)。
    3) • 使得更容易增加新類型的組件 新定義的Composite或Leaf子類自動(dòng)地與已有的結(jié)構(gòu)和客戶代碼一起工作,客戶程序不需因新的Component類而改變。
    4) • 使你的設(shè)計(jì)變得更加一般化 容易增加新組件也會(huì)產(chǎn)生一些問(wèn)題,那就是很難限制組合中的組件。有時(shí)你希望一個(gè)組合只能有某些特定的組件。使用Composite時(shí),你不能依賴類型系統(tǒng)施加這些約束,而必須在運(yùn)行時(shí)刻進(jìn)行檢查。

9. 實(shí)現(xiàn)

比較經(jīng)典的例子是樹(shù)形菜單。多級(jí)展示,這個(gè)菜單可以無(wú)限增加節(jié)點(diǎn);例外就是文件遍歷等等。

?php 
/**
 * 組合模式 
 * 
 * @author guisu
 * @version 1.0
 * 組合模式:樹(shù)形菜單
 * 
 * 將對(duì)象組合成樹(shù)形結(jié)構(gòu)以表示"部分-整體"的層次結(jié)構(gòu),使得客戶對(duì)單個(gè)對(duì)象和復(fù)合對(duì)象的使用具有一致性 
 */ 
/**
 * 抽象構(gòu)件角色(component)
 *
 */
abstract class MenuComponent
{
 public function add($component){}
 public function remove($component){}
 public function getName(){}
 public function getUrl(){}
 public function displayOperation(){}
}
/**
 * 樹(shù)枝構(gòu)件角色(Composite)
 *
 */
class MenuComposite extends MenuComponent
{
 private $_items = array();
 private $_name = null;
 private $_align = '';
 public function __construct($name) {
 $this->_name = $name;
 }
 public function add($component) {
 $this->_items[$component->getName()] = $component;
 }
 public function remove($component) {
 $key = array_search($component,$this->_items);
 if($key !== false) unset($this->_items[$key]);
 }
 public function getItems() {
 return $this->_items;
 }
 
 public function displayOperation() {
 static $align = '|';
 if($this->getItems()) {
  //substr($align, strpos($align,));
  $align .= ' _ _ ';
 }else{
  $align .='';
 }
 echo $this->_name, " br/>";
 foreach($this->_items as $name=> $item) {
  echo $align;
  $item->displayOperation();
 }
 }
 
 public function getName(){
 return $this->_name;
 }
}
 
/**
 *樹(shù)葉構(gòu)件角色(Leaf)
 *
 */
class ItemLeaf extends MenuComponent
{
 private $_name = null;
 private $_url = null;
 //public $_align = '----';
 public function __construct($name,$url)
 {
 $this->_name = $name;
 $this->_url = $url;
 }
 
 public function displayOperation()
 {
 echo 'a href="', $this->_url, '" rel="external nofollow" >' , $this->_name, '/a>br/>';
 }
 
 public function getName(){
 return $this->_name;
 }
}
 
class Client
{
 public static function displayMenu()
 {
 $subMenu1 = new MenuComposite("submenu1");
 $subMenu2 = new MenuComposite("submenu2");
 $subMenu3 = new MenuComposite("submenu3");
 
 $subMenu4 = new MenuComposite("submenu4");
 $subMenu5 = new MenuComposite("submenu5");
 /*
 $item1 = new ItemLeaf("sohu","www.163.com");
 $item2 = new ItemLeaf("sina","www.sina.com");
 
 $subMenu4 = new MenuComposite("submenu4");
 $subMenu1->add($subMenu4);
 
 $subMenu4->add($item1);
 $subMenu4->add($item2);
 */
 $item3 = new ItemLeaf("baidu","www.baidu.com");
 $item4 = new ItemLeaf("google","www.google.com");
 $subMenu2->add($item3);
 $subMenu2->add($item4);
 
 $allMenu = new MenuComposite("AllMenu");
 $allMenu->add($subMenu1);
 $allMenu->add($subMenu2);
 $allMenu->add($subMenu3);
 $subMenu3->add($subMenu4);
 $subMenu4->add($subMenu5);
 $allMenu->displayOperation();
 }
}
// 創(chuàng)建menu
Client::displayMenu();
?>

10. 組合模式和其他相關(guān)模式

1)裝飾模式(Decorator模式)經(jīng)常與Composite模式一起使用。當(dāng)裝飾和組合一起使用時(shí),它們

通常有一個(gè)公共的父類。因此裝飾必須支持具有 Add、Remove和GetChild 操作的Component接口。

2)Flyweight模式讓你共享組件,但不再能引用他們的父部件。

3)(迭代器模式)Itertor可用來(lái)遍歷Composite。

4)(觀察者模式)Visitor將本來(lái)應(yīng)該分布在Composite和L e a f類中的操作和行為局部化。

11. 總結(jié)

組合模式解耦了客戶程序與復(fù)雜元素內(nèi)部結(jié)構(gòu),從而使客戶程序可以向處理簡(jiǎn)單元素一樣來(lái)處理復(fù)雜元素。

如果你想要?jiǎng)?chuàng)建層次結(jié)構(gòu),并可以在其中以相同的方式對(duì)待所有元素,那么組合模式就是最理想的選擇。

更多關(guān)于PHP相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《php面向?qū)ο蟪绦蛟O(shè)計(jì)入門教程》、《PHP數(shù)組(Array)操作技巧大全》、《PHP基本語(yǔ)法入門教程》、《PHP運(yùn)算與運(yùn)算符用法總結(jié)》、《php字符串(string)用法總結(jié)》、《php+mysql數(shù)據(jù)庫(kù)操作入門教程》及《php常見(jiàn)數(shù)據(jù)庫(kù)操作技巧匯總》

希望本文所述對(duì)大家PHP程序設(shè)計(jì)有所幫助。

您可能感興趣的文章:
  • PHP設(shè)計(jì)模式(九)外觀模式Facade實(shí)例詳解【結(jié)構(gòu)型】
  • PHP設(shè)計(jì)模式(八)裝飾器模式Decorator實(shí)例詳解【結(jié)構(gòu)型】
  • PHP設(shè)計(jì)模式(六)橋連模式Bridge實(shí)例詳解【結(jié)構(gòu)型】
  • PHP設(shè)計(jì)模式(五)適配器模式Adapter實(shí)例詳解【結(jié)構(gòu)型】
  • PHP設(shè)計(jì)模式(四)原型模式Prototype實(shí)例詳解【創(chuàng)建型】
  • PHP設(shè)計(jì)模式(三)建造者模式Builder實(shí)例詳解【創(chuàng)建型】
  • PHP設(shè)計(jì)模式(一)工廠模式Factory實(shí)例詳解【創(chuàng)建型】
  • 深入分析PHP設(shè)計(jì)模式

標(biāo)簽:通遼 隴南 唐山 平頂山 河南 南通 武漢 黃山

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《PHP設(shè)計(jì)模式(七)組合模式Composite實(shí)例詳解【結(jié)構(gòu)型】》,本文關(guān)鍵詞  PHP,設(shè)計(jì)模式,七,組合,模式,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問(wèn)題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無(wú)關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《PHP設(shè)計(jì)模式(七)組合模式Composite實(shí)例詳解【結(jié)構(gòu)型】》相關(guān)的同類信息!
  • 本頁(yè)收集關(guān)于PHP設(shè)計(jì)模式(七)組合模式Composite實(shí)例詳解【結(jié)構(gòu)型】的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章
    久久国产一区二区| 国产精品自拍一区| 欧美大片一区| 亚洲天堂一区二区三区四区| 日韩专区第一页| 台湾毛片| 一级片片| 国产视频久久久久| 青青青草影院| 国产精品123| 日韩免费在线视频| 国产a毛片| 日本在线播放一区| 日本伦理片网站| 日日夜人人澡人人澡人人看免| 精品国产一区二区三区国产馆| 香蕉视频久久| 国产伦理精品| 二级片在线观看| 九九久久99| 九九九网站| 青青青草影院 | 久久国产一区二区| 国产一区二区精品尤物| 欧美夜夜骑 青草视频在线观看完整版 久久精品99无色码中文字幕 欧美日韩一区二区在线观看视频 欧美中文字幕在线视频 www.99精品 香蕉视频久久 | 91麻豆tv| 成人免费观看网欧美片| 美女免费精品视频在线观看| 精品视频一区二区三区| 久久久久久久免费视频| 九九久久99综合一区二区| 国产伦理精品| 青青久久精品| 韩国毛片基地| 国产高清视频免费| 日本在线不卡免费视频一区| 可以免费看毛片的网站| 日本伦理片网站| 黄色福利| 国产一区二区福利久久| 日本免费乱人伦在线观看| 欧美另类videosbestsex高清| 日本在线播放一区| 九九精品在线播放| 黄视频网站免费看| 国产视频久久久久| 欧美大片a一级毛片视频| 日韩男人天堂| 欧美一级视频高清片| 精品国产香蕉在线播出| 欧美夜夜骑 青草视频在线观看完整版 久久精品99无色码中文字幕 欧美日韩一区二区在线观看视频 欧美中文字幕在线视频 www.99精品 香蕉视频久久 | a级精品九九九大片免费看| 韩国三级一区| 99久久视频| 亚洲天堂免费观看| 国产亚洲精品aaa大片| 黄视频网站在线看| 欧美一级视频高清片| 久久国产一区二区| 青青久久国产成人免费网站| 韩国三级视频网站| 久久国产影视免费精品| 久久国产精品自由自在| 久久99中文字幕久久| 国产不卡在线看| 日韩免费片| 毛片电影网| 免费国产一级特黄aa大片在线| 亚欧乱色一区二区三区| 人人干人人草| 国产网站免费观看| 你懂的福利视频| 精品国产一区二区三区久久久狼| 国产精品1024永久免费视频| 国产麻豆精品免费密入口| 国产a视频| 精品久久久久久免费影院| 九九免费高清在线观看视频| 黄视频网站免费观看| 欧美夜夜骑 青草视频在线观看完整版 久久精品99无色码中文字幕 欧美日韩一区二区在线观看视频 欧美中文字幕在线视频 www.99精品 香蕉视频久久 | 免费一级片在线| 欧美激情影院| 久久国产精品自由自在| 精品久久久久久中文| 国产原创中文字幕| 国产国语对白一级毛片| 四虎论坛| 国产一级生活片| 91麻豆精品国产片在线观看| 久久精品道一区二区三区| 日本乱中文字幕系列 | 高清一级淫片a级中文字幕| a级黄色毛片免费播放视频| 精品视频在线观看一区二区| 中文字幕一区二区三区精彩视频| 成人免费高清视频| 精品久久久久久中文| 麻豆网站在线免费观看| 日本伦理片网站| 亚洲第一页色| 超级乱淫伦动漫| 精品国产亚一区二区三区| 国产视频久久久久| 四虎久久影院| 国产网站免费| 国产一区二区福利久久| 国产网站麻豆精品视频| 99色播| 久草免费在线视频| 国产不卡高清| 青青久久网| 亚洲精品久久玖玖玖玖| 99久久视频| 国产一区二区精品久久91| 精品国产香蕉伊思人在线又爽又黄| 台湾毛片| 香蕉视频一级| 精品久久久久久中文字幕一区 | 天天做日日爱夜夜爽| 高清一级片| 高清一级毛片一本到免费观看| 亚欧成人乱码一区二区| 99色视频在线观看| 久久99中文字幕久久| 青青久久网| 精品视频在线观看视频免费视频| 99久久精品国产国产毛片| 黄视频网站免费看| 成人高清护士在线播放| 国产伦理精品| 黄色免费网站在线| 色综合久久久久综合体桃花网| 精品国产亚洲人成在线| 日本久久久久久久 97久久精品一区二区三区 狠狠色噜噜狠狠狠狠97 日日干综合 五月天婷婷在线观看高清 九色福利视频 | 九九热国产视频| 日韩在线观看网站| 成人高清视频在线观看| 成人免费高清视频| 天天做日日爱| 日本伦理片网站| 中文字幕97| 日韩免费在线视频| 亚洲女初尝黑人巨高清在线观看| 国产麻豆精品免费视频| 亚久久伊人精品青青草原2020| 精品久久久久久影院免费| 99色播| 黄色福利片| 精品视频在线看| 日本久久久久久久 97久久精品一区二区三区 狠狠色噜噜狠狠狠狠97 日日干综合 五月天婷婷在线观看高清 九色福利视频 | 高清一级做a爱过程不卡视频| 欧美激情一区二区三区在线 | 青青久久精品| 国产网站免费观看| 日韩av成人| 中文字幕一区二区三区精彩视频| 一级女性大黄生活片免费| 高清一级毛片一本到免费观看| 一级毛片视频在线观看| 亚洲爆爽| 美女免费黄网站| 久久99中文字幕久久| 日本伦理片网站| 国产成人啪精品| 中文字幕97| 成人av在线播放| 亚洲天堂一区二区三区四区| 91麻豆高清国产在线播放| 日韩av片免费播放| 天天做人人爱夜夜爽2020毛片| 国产不卡高清在线观看视频| 欧美激情一区二区三区视频高清| 日韩男人天堂| 一级女人毛片人一女人| 日本在线不卡免费视频一区| 成人免费高清视频| 日韩在线观看视频黄| 91麻豆精品国产高清在线| 91麻豆精品国产综合久久久| 99久久精品国产免费| 精品在线视频播放| 日韩专区在线播放| 日韩av成人| 精品国产三级a| 可以在线看黄的网站| 欧美18性精品| a级黄色毛片免费播放视频| 欧美电影免费看大全| 欧美日本二区| 欧美日本二区| 日韩一级黄色| 亚洲第一色在线| 日韩男人天堂| 日本在线播放一区| 日本久久久久久久 97久久精品一区二区三区 狠狠色噜噜狠狠狠狠97 日日干综合 五月天婷婷在线观看高清 九色福利视频 | 国产一区二区精品尤物| 国产a毛片| 日韩中文字幕在线观看视频| 中文字幕Aⅴ资源网| 欧美激情一区二区三区在线播放 |