欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

 更新時(shí)間:2020年05月02日 11:46:37   作者:規(guī)速  
這篇文章主要介紹了PHP設(shè)計(jì)模式:組合模式Composite,結(jié)合實(shí)例形式詳細(xì)分析了PHP組合模式Composite基本概念、功能、原理、用法及操作注意事項(xiàng),需要的朋友可以參考下

本文實(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ì)象??蛻舳舜a必須區(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)

典型的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)它。  

          樹葉構(gòu)件角色(Leaf):在組合樹中表示葉節(jié)點(diǎn)對(duì)象,葉節(jié)點(diǎn)沒(méi)有子節(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ì)象又可以被組合,這樣不斷的遞歸下去??蛻舸a中,任何用到   基本對(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="', $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ì)有所幫助。

相關(guān)文章

  • Laravel框架自定義驗(yàn)證過(guò)程實(shí)例分析

    Laravel框架自定義驗(yàn)證過(guò)程實(shí)例分析

    這篇文章主要介紹了Laravel框架自定義驗(yàn)證過(guò)程,結(jié)合實(shí)例形式分析了Laravel框架自定義驗(yàn)證的相關(guān)原理、路由、模型等操作技巧,需要的朋友可以參考下
    2019-02-02
  • ThinkPHP框架實(shí)現(xiàn)數(shù)據(jù)增刪改

    ThinkPHP框架實(shí)現(xiàn)數(shù)據(jù)增刪改

    本文實(shí)例講述了thinkPHP數(shù)據(jù)庫(kù)增刪改查操作方法。分享給大家供大家參考。希望對(duì)大家學(xué)習(xí)使用thinkPHP有所幫助
    2017-05-05
  • PHP內(nèi)核學(xué)習(xí)教程之php opcode內(nèi)核實(shí)現(xiàn)

    PHP內(nèi)核學(xué)習(xí)教程之php opcode內(nèi)核實(shí)現(xiàn)

    opcode是計(jì)算機(jī)指令中的一部分,用于指定要執(zhí)行的操作, 指令的格式和規(guī)范由處理器的指令規(guī)范指定,通過(guò)本文給大家介紹PHP內(nèi)核學(xué)習(xí)教程之php opcode內(nèi)核實(shí)現(xiàn),感興趣的朋友一起學(xué)習(xí)吧
    2016-01-01
  • php隨機(jī)輸出名人名言的代碼

    php隨機(jī)輸出名人名言的代碼

    正如你看到的“小談博客”標(biāo)題后面的名人名言一樣,每刷新一次就會(huì)隨機(jī)出現(xiàn)一條語(yǔ)句,把你喜歡的話放到一起,經(jīng)常出現(xiàn)在你眼前,給你溫暖的力量
    2012-10-10
  • php實(shí)現(xiàn)的太平洋時(shí)間和北京時(shí)間互轉(zhuǎn)的自定義函數(shù)分享

    php實(shí)現(xiàn)的太平洋時(shí)間和北京時(shí)間互轉(zhuǎn)的自定義函數(shù)分享

    這篇文章主要介紹了php實(shí)現(xiàn)的太平洋時(shí)間和北京時(shí)間互轉(zhuǎn)的自定義函數(shù)分享,主要靠date_default_timezone_set函數(shù)來(lái)實(shí)現(xiàn),需要的朋友可以參考下
    2014-08-08
  • Yii2框架可逆加密簡(jiǎn)單實(shí)現(xiàn)方法

    Yii2框架可逆加密簡(jiǎn)單實(shí)現(xiàn)方法

    這篇文章主要介紹了Yii2框架可逆加密簡(jiǎn)單實(shí)現(xiàn)方法,涉及Yii框架encryptByPassword()與decryptByPassword()函數(shù)簡(jiǎn)單使用方法,需要的朋友可以參考下
    2017-08-08
  • Yii框架數(shù)據(jù)模型的驗(yàn)證規(guī)則rules()被執(zhí)行的方法

    Yii框架數(shù)據(jù)模型的驗(yàn)證規(guī)則rules()被執(zhí)行的方法

    這篇文章主要介紹了Yii框架數(shù)據(jù)模型的驗(yàn)證規(guī)則rules()被執(zhí)行的方法,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下
    2016-12-12
  • Laravel 微信小程序后端搭建步驟詳解

    Laravel 微信小程序后端搭建步驟詳解

    這篇文章主要介紹了Laravel 微信小程序后端搭建步驟詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-11-11
  • PHP微商城開源代碼實(shí)例

    PHP微商城開源代碼實(shí)例

    這篇文章主要介紹了PHP微商城代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-03-03
  • Redis使用Eval多個(gè)鍵值自增的操作實(shí)例

    Redis使用Eval多個(gè)鍵值自增的操作實(shí)例

    下面小編就為大家?guī)?lái)一篇Redis使用Eval 多個(gè)鍵值自增的操作實(shí)例。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2016-11-11

最新評(píng)論