日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁(yè)技術(shù)文章
文章詳情頁(yè)

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

瀏覽:282日期:2022-09-10 14:49:56

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

1. 概述

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

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

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

2.問(wèn)題

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

3. 解決方案

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

有時(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)

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

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

PHP設(shè)計(jì)模式(七)組合模式Composite實(shí)例詳解【結(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)它。

樹葉構(gòu)件角色(Leaf):在組合樹中表示葉節(jié)點(diǎn)對(duì)象,葉節(jié)點(diǎn)沒有子節(jié)點(diǎn)。并在組合中定義圖元對(duì)象的行為。 樹枝構(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ì)象又可以被組合,這樣不斷的遞歸下去。客戶代碼中,任何用到 基本對(duì)象的地方都可以使用組合對(duì)象。 2) • 簡(jiǎn)化客戶代碼 客戶可以一致地使用組合結(jié)構(gòu)和單個(gè)對(duì)象。通常用戶不知道 (也不關(guān)心)處理的是一個(gè)葉節(jié)點(diǎn)還是一個(gè)組合組件。這就簡(jiǎn)化了客戶代碼 , 因?yàn)樵诙x組合的那些類中不需要寫一些充斥著選擇語(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)典的例子是樹形菜單。多級(jí)展示,這個(gè)菜單可以無(wú)限增加節(jié)點(diǎn);例外就是文件遍歷等等。

<?php /** * 組合模式 * * @author guisu * @version 1.0 * 組合模式:樹形菜單 * * 將對(duì)象組合成樹形結(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(){}}/** * 樹枝構(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; }} /** *樹葉構(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='http://www.b3g6.com/bcjs/’, $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)建menuClient::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常見數(shù)據(jù)庫(kù)操作技巧匯總》

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

標(biāo)簽: PHP
相關(guān)文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
久久蜜桃精品| 精品国产三区在线| 久久国产欧美| 亚洲精品一区三区三区在线观看| 日韩欧美三级| 在线看片福利| 亚洲福利久久| 亚洲在线电影| 日本精品久久| 国产精品亚洲人成在99www| 精品国产亚洲一区二区三区在线| 日韩在线二区| 国产精品免费看| 欧美亚洲二区| 麻豆理论在线观看| 亚洲在线网站| 国产精品2023| 99久久九九| 蜜桃免费网站一区二区三区| 国产视频一区二| 久久中文欧美| 精品一区欧美| 亚洲91在线| 精品一区二区三区中文字幕在线| 色婷婷久久久| 综合国产视频| 97精品国产一区二区三区| 亚洲欧洲午夜| 欧美a在线观看| 私拍精品福利视频在线一区| 一本综合精品| 国产成人调教视频在线观看| 亚洲主播在线| 91麻豆国产自产在线观看亚洲| 激情综合网站| 日本欧美在线| 久久婷婷亚洲| 国产精品自拍区| 亚洲一本视频| 美女高潮久久久| 在线亚洲国产精品网站| 久久香蕉精品香蕉| 99国产精品99久久久久久粉嫩| 国产精品一级| 免费日韩av片| 在线一区视频观看| 国产精品天堂蜜av在线播放| 在线午夜精品| 日韩久久精品网| 欧美日韩一区二区国产| 欧美成人精品三级网站| 国产精品久一| 一二三区精品| 国内精品99| 日本不卡免费高清视频在线| 日本午夜精品久久久| 日韩一区二区免费看| 中文一区一区三区高中清不卡免费| 日韩一区二区三区精品视频第3页| 亚洲午夜av| 国产美女高潮在线| 国产精品久久久久av蜜臀| 一二三区精品| 中日韩男男gay无套| 中文av在线全新| 国产麻豆一区二区三区| 乱人伦精品视频在线观看| 麻豆精品蜜桃| 在线手机中文字幕| 国精品产品一区| 欧美国产视频| 日韩av电影一区| 伊人久久一区| 久久av一区| 六月婷婷一区| 国产精品嫩草99av在线| 久久人人97超碰国产公开结果| 国产精品久久免费视频| 日本午夜精品| 91欧美精品| 中文字幕日本一区二区| 亚洲永久字幕| 国产视频亚洲| 亚洲欧美日韩专区| 在线视频免费在线观看一区二区| 免费欧美一区| 妖精视频成人观看www| 成人av二区| 午夜国产一区二区| 国产精品av久久久久久麻豆网| 日韩欧美二区| 在线观看精品| 成人午夜国产| 欧美91精品| 老牛影视一区二区三区| 亚洲在线观看| 蜜臀精品一区二区三区在线观看| 伊人久久大香线蕉av超碰演员| 欧美+亚洲+精品+三区| 1024精品久久久久久久久| 欧美女激情福利| 日韩影院在线观看| 婷婷成人av| 国产精品片aa在线观看| 国产一区二区三区国产精品| 色偷偷色偷偷色偷偷在线视频| 国产精品成久久久久| 视频福利一区| 激情综合网站| 亚洲精品日本| 久久午夜精品| 日韩和欧美的一区| 国产精品香蕉| 日韩成人三级| 久久不射网站| 国产精品分类| 亚洲a一区二区三区| 亚洲欧美日本日韩| 青青国产91久久久久久| 国产精品对白| 欧美成a人免费观看久久| 亚洲国产不卡| 日韩和欧美的一区| 国产成人精品免费视| 午夜影院欧美| 亚洲tv在线| 久久精品免视看国产成人| 99成人在线视频| 亚洲欧洲美洲国产香蕉| 国产麻豆精品久久| 日韩视频网站在线观看| 久久性天堂网| 韩日一区二区| 亚洲作爱视频| 欧美国产中文高清| 欧美一区二区三区高清视频 | 亚洲综合福利| 欧美日韩一视频区二区| 色婷婷综合网| 日韩精品一二三区| 免费观看亚洲天堂| 午夜久久免费观看| 国产精品久久亚洲不卡| av亚洲免费| 久久精品国产99| 尹人成人综合网| 国产精品sss在线观看av| 免费黄色成人| 国产精品videossex久久发布 | 亚洲综合电影| 亚洲精品国产日韩| 国产成人免费精品| 婷婷视频一区二区三区| 水蜜桃久久夜色精品一区| 中文字幕一区二区三区在线视频| 超碰在线99| 欧美影院精品| 日韩午夜精品| 国产精品久久久久久久久妇女| 免费看日韩精品| 欧美13videosex性极品| 日本三级亚洲精品| 国产一区久久| 久久中文字幕导航| 亚洲三级精品| 红桃视频国产精品| 亚洲啊v在线| 久久天堂影院| 欧美日韩中出| 亚洲色图综合| 伊人精品一区| 久久久久久夜| 国产精品欧美日韩一区| 一区二区不卡| 99亚洲精品| 99久久精品费精品国产| 国产一区二区三区精品在线观看| 日韩精品一二三四| 欧美成人综合| 免费看av不卡| 四虎国产精品免费观看| 国产欧美88| 日韩激情视频网站| 综合国产在线| 在线精品一区| 久久最新视频| 亚洲欧洲日本mm| 91精品1区| 欧美日韩国产高清| 久久久777| 亚洲成人精品| 亚洲性色av| 精品久久网站| 国产精品99视频| 日韩成人a**站| 中文字幕在线视频网站| 狠狠久久伊人| 中文在线а√在线8| 中文字幕在线免费观看视频| 欧美激情另类|