成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久

您的位置:首頁技術文章
文章詳情頁

PHP設計模式(七)組合模式Composite實例詳解【結構型】

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

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

1. 概述

在數據結構里面,樹結構是很重要,我們可以把樹的結構應用到設計模式里面。

例子1:就是多級樹形菜單。

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

2.問題

我們可以使用簡單的對象組合成復雜的對象,而這個復雜對象有可以組合成更大的對象。我們可以把簡單這些對象定義成類,然后定義一些容器類來存儲這些簡單對象。客戶端代碼必須區別對象簡單對象和容器對象,而實際上大多數情況下用戶認為它們是一樣的。對這些類區別使用,使得程序更加復雜。遞歸使用的時候跟麻煩,而我們如何使用遞歸組合,使得用戶不必對這些類進行區別呢?

3. 解決方案

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

有時候又叫做部分-整體模式,它使我們樹型結構的問題中,模糊了簡單元素和復雜元素的概念,客戶程序可以向處理簡單元素一樣來處理復雜元素,從而使得客戶程序與復雜元素的內部結構解耦。

組合模式讓你可以優化處理遞歸或分級數據結構。有許多關于分級數據結構的例子,使得組合模式非常有用武之地。關于分級數據結構的一個普遍性的例子是你每次使用電腦時所遇到的:文件系統。文件系統由目錄和文件組成。每個目錄都可以裝內容。目錄的內容可以是文件,也可以是目錄。按照這種方式,計算機的文件系統就是以遞歸結構來組織的。如果你想要描述這樣的數據結構,那么你可以使用組合模式Composite。

4. 組合模式的分類

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

5. 適用性

以下情況下適用Composite模式:

1).你想表示對象的部分-整體層次結構

2).你希望用戶忽略組合對象與單個對象的不同,用戶將統一地使用組合結構中的所有對象。

6. 結構

PHP設計模式(七)組合模式Composite實例詳解【結構型】

典型的Composite對象結構如下圖所示:

PHP設計模式(七)組合模式Composite實例詳解【結構型】

7. 構建模式的組成

抽象構件角色(component):是組合中的對象聲明接口,在適當的情況下,實現所有類共有接口的默認行為。聲明一個接口用于訪問和管理Component子部件。

這個接口可 以用來管理所有的子對象。(可選)在遞歸結構中定義一個接口,用于訪問一個父部件,并在合適的情況下實現它。

樹葉構件角色(Leaf):在組合樹中表示葉節點對象,葉節點沒有子節點。并在組合中定義圖元對象的行為。 樹枝構件角色(Composite):定義有子部件的那些部件的行為。存儲子部件。在Component接口中實現與子部件有關的操作。 客戶角色(Client):通過component接口操縱組合部件的對象。

8. 效果

1) • 定義了包含基本對象和組合對象的類層次結構 基本對象可以被組合成更復雜的組合對象,而這個組合對象又可以被組合,這樣不斷的遞歸下去。客戶代碼中,任何用到 基本對象的地方都可以使用組合對象。 2) • 簡化客戶代碼 客戶可以一致地使用組合結構和單個對象。通常用戶不知道 (也不關心)處理的是一個葉節點還是一個組合組件。這就簡化了客戶代碼 , 因為在定義組合的那些類中不需要寫一些充斥著選擇語句的函數。 3) • 使得更容易增加新類型的組件 新定義的Composite或Leaf子類自動地與已有的結構和客戶代碼一起工作,客戶程序不需因新的Component類而改變。 4) • 使你的設計變得更加一般化 容易增加新組件也會產生一些問題,那就是很難限制組合中的組件。有時你希望一個組合只能有某些特定的組件。使用Composite時,你不能依賴類型系統施加這些約束,而必須在運行時刻進行檢查。

9. 實現

比較經典的例子是樹形菜單。多級展示,這個菜單可以無限增加節點;例外就是文件遍歷等等。

<?php /** * 組合模式 * * @author guisu * @version 1.0 * 組合模式:樹形菜單 * * 將對象組合成樹形結構以表示'部分-整體'的層次結構,使得客戶對單個對象和復合對象的使用具有一致性 */ /** * 抽象構件角色(component) * */abstract class MenuComponent{ public function add($component){} public function remove($component){} public function getName(){} public function getUrl(){} public function displayOperation(){}}/** * 樹枝構件角色(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; }} /** *樹葉構件角色(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.piao2010.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(); }}// 創建menuClient::displayMenu();?>10. 組合模式和其他相關模式

1)裝飾模式(Decorator模式)經常與Composite模式一起使用。當裝飾和組合一起使用時,它們

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

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

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

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

11. 總結

組合模式解耦了客戶程序與復雜元素內部結構,從而使客戶程序可以向處理簡單元素一樣來處理復雜元素。

如果你想要創建層次結構,并可以在其中以相同的方式對待所有元素,那么組合模式就是最理想的選擇。

更多關于PHP相關內容感興趣的讀者可查看本站專題:《php面向對象程序設計入門教程》、《PHP數組(Array)操作技巧大全》、《PHP基本語法入門教程》、《PHP運算與運算符用法總結》、《php字符串(string)用法總結》、《php+mysql數據庫操作入門教程》及《php常見數據庫操作技巧匯總》

希望本文所述對大家PHP程序設計有所幫助。

標簽: PHP
相關文章:
成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久
天天色综合天天| 欧美日韩久久一区二区| 日日夜夜精品免费视频| 韩国女主播一区| 福利视频网站一区二区三区| 欧美精品二区三区四区免费看视频| 激情综合在线| 久久亚洲高清| 欧美一卡二卡在线观看| 国产日韩亚洲欧美综合| 一区二区三区四区高清精品免费观看 | 亚洲国产综合人成综合网站| 国产一区二区三区高清播放| 欧美激情五月| 国产欧美va欧美不卡在线| 欧美影院一区| 欧美三级中文字幕| 欧美国产亚洲另类动漫| 欧美视频一区在线观看| 国产日韩av一区| 国产成人激情av| 男人的天堂亚洲| 日韩视频一区二区| 亚洲一区在线观看视频| 懂色av一区二区三区免费看| 91精品国产综合久久婷婷香蕉 | 久久免费精品国产久精品久久久久| 一区二区三区精品在线观看| 一本久久知道综合久久| 日韩一级大片在线观看| 国产成人综合网| 日韩你懂的在线观看| 一区二区国产视频| 国产精品日韩精品欧美精品| www日韩大片| 欧美一区二区三区婷婷月色| 国模冰冰炮一区二区| 在线播放中文一区| 亚洲成人tv网| 国产精品99一区二区| 在线成人午夜影院| 成人免费高清在线| 在线精品视频免费观看| 亚洲主播在线播放| 久久尤物视频| 久久精品国产精品亚洲精品 | 亚洲欧美春色| 欧美激情一区二区在线| 欧美日本一区二区视频在线观看 | 欧美日韩国产成人在线免费| 国产成人亚洲综合a∨婷婷图片| 久久综合av免费| 在线成人av| 久久欧美一区二区| 亚洲一级影院| 亚洲国产日韩在线一区模特| 欧美亚洲综合一区| 成人国产精品免费观看视频| 久久久综合香蕉尹人综合网| 麻豆久久一区二区| 中文亚洲欧美| 美女mm1313爽爽久久久蜜臀| 日韩欧美在线网站| 亚洲无玛一区| 日韩电影在线看| 99精品国产99久久久久久福利| 26uuu亚洲婷婷狠狠天堂| 欧美日产一区二区三区在线观看| 亚洲综合激情另类小说区| 91福利视频在线| 性做久久久久久免费观看欧美| 欧美日韩不卡视频| 94-欧美-setu| 精品久久久久久综合日本欧美| 精品在线你懂的| 一本久道久久综合中文字幕 | 韩国精品在线观看| 国产精品视频第一区| 成人福利电影精品一区二区在线观看 | 欧美区一区二| 午夜精品久久久久久久| 欧美不卡一区二区三区| 亚洲精华国产欧美| 中文字幕一区二区三区在线观看| 92国产精品观看| 亚洲综合色噜噜狠狠| 69久久夜色精品国产69蝌蚪网| 欧美午夜不卡| 美腿丝袜亚洲三区| 亚洲国产精华液网站w| 日本乱人伦一区| 91在线视频免费91| 亚洲一区二区三区中文字幕在线| 91精品国产色综合久久不卡电影 | 欧美久久久久久久久中文字幕| 女同性一区二区三区人了人一| 一区二区三区影院| 日韩欧美黄色影院| 国产日产精品一区二区三区四区的观看方式| 国内精品国产三级国产a久久| 国产精品久久久久aaaa樱花| 国产综合久久| 亚洲欧美韩国综合色| 亚洲激情综合| 粉嫩在线一区二区三区视频| 樱花影视一区二区| 久久精品系列| 久久国产生活片100| 国产精品拍天天在线| 欧美日韩精品福利| 国产手机视频一区二区| 成人国产精品免费观看| 日产欧产美韩系列久久99| 国产精品网站在线播放| 这里只有精品视频在线观看| 亚洲欧美日韩精品综合在线观看| 不卡一二三区首页| 精品一二三四在线| 亚洲一区二区偷拍精品| 久久奇米777| 欧美乱妇15p| 9色精品在线| 欧美一区二区| 国产精品影视网| 久久久综合精品| 欧美性大战久久久久久久蜜臀| 黄色成人在线网址| 成人国产在线观看| 韩国一区二区在线观看| 五月综合激情网| 中文字幕不卡三区| 日韩精品中文字幕一区| 欧美午夜一区二区三区| 中文精品在线| 欧美三级午夜理伦三级中文幕| 国产一区二区剧情av在线| 亚洲一区二区三区自拍| 中文字幕精品在线不卡| 欧美一区二区视频在线观看| 久久久国产亚洲精品| 亚洲午夜精品一区二区| 成人av电影在线| 激情综合色综合久久综合| 亚洲国产毛片aaaaa无费看 | 《视频一区视频二区| 欧美精品一区二区三区久久久| 国产一区视频在线观看免费| 国产成人av电影在线播放| 美腿丝袜一区二区三区| 婷婷开心久久网| 亚洲一区二区三区四区中文字幕 | 国产xxx精品视频大全| 日韩电影在线观看网站| 亚洲影院理伦片| 自拍偷拍国产精品| 欧美在线观看18| 亚洲欧美卡通另类91av| 亚洲经典三级| 黑丝一区二区三区| 欧美在线日韩精品| 99综合电影在线视频| 亚洲综合一区二区三区| 国产精品国产三级国产普通话蜜臀| 2021中文字幕一区亚洲| 日韩亚洲欧美一区| 4438x成人网最大色成网站| 欧美色欧美亚洲另类二区| 在线亚洲一区观看| 色婷婷综合激情| 在线视频国内一区二区| 欧美天堂一区二区三区| 欧美日韩精品一区视频| 欧美日韩一级二级| 欧美日韩视频不卡| 欧美日韩免费高清一区色橹橹| 在线观看亚洲精品| 91精品办公室少妇高潮对白| 在线免费一区三区| 欧美日韩另类一区| 7777精品伊人久久久大香线蕉超级流畅 | 精品国产伦一区二区三区观看方式 | 国产精品久久久久久久久免费樱桃 | 一区二区三区四区在线| 一区二区三区在线高清| 亚洲尤物在线视频观看| 日韩精品亚洲一区二区三区免费| 亚洲国产日韩综合久久精品| 五月激情丁香一区二区三区| 日韩精品电影在线观看| 日韩电影在线免费观看| 久久99国产精品久久99果冻传媒| 狠狠色2019综合网| 国产一区二区三区久久悠悠色av| 国产成人综合在线| a4yy欧美一区二区三区| 欧美日韩一区二区视频在线| 亚洲大胆av| 久久国产日韩| 欧美日本在线看| 欧美mv日韩mv国产网站|