日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

php 组合模式,php设计模式(十三)透明组合模式

發布時間:2024/9/19 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 php 组合模式,php设计模式(十三)透明组合模式 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

組合模式用來解決整體和部分可以一致對待的問題;

比如說 文件夾 和其下的 文件;

可以復制文件也可以復制整個文件夾;

組合模式是將對象組合成樹形結構以表示整體和部分的層次結構;

可以方便的增加節點;

組合模式分為兩種;透明模式

安全模式

我們先來說透明組合模式;

結構

Component:包含樹枝節點和葉子節點方法的抽象類

Composite:樹枝節點 有子節點 示例中指 Dir 文件夾

Leaf:葉子節點 沒有子節點 示例中指 File 文件

示例

包含樹枝節點和葉子節點方法的抽象類

Component.php<?php

namespace Baijunyao\DesignPatterns\SafeComposite;

/**

* 包含樹枝節點和葉子節點方法的抽象類

*

* Class Component

* @package Baijunyao\DesignPatterns\SafeComposite

*/

abstract class Component

{

/**

* @var

*/

protected $name;

/**

* Component constructor.

* @param $name

*/

public function __construct($name)

{

$this->name = $name;

}

/**

* @return mixed

*/

abstract public function display();

}

文件夾

Dir.php<?php

namespace Baijunyao\DesignPatterns\SafeComposite;

/**

* 文件夾

*

* Class Dir

* @package Baijunyao\DesignPatterns\SafeComposite

*/

class Dir extends Component

{

/**

* @var array

*/

protected $children = [];

/**

* 添加子節點

*

* @param Component $component

*/

public function add(Component $component)

{

$this->children[] = $component;

}

/**

* @return mixed|string

*/

public function display()

{

$nameStr = $this->name .'
';

foreach ($this->children as $k => $v) {

$nameStr .= '--' . $v->display();

}

return $nameStr;

}

}

文件

File.php<?php

namespace Baijunyao\DesignPatterns\SafeComposite;

/**

* 文件

*

* Class File

* @package Baijunyao\DesignPatterns\SafeComposite

*/

class File extends Component

{

/**

* @param Component $component

* @throws \Exception

*/

public function add(Component $component)

{

throw new \Exception('文件不能添加子節點');

}

/**

* @return mixed|string

*/

public function display()

{

return '--' . $this->name .'
';

}

}

運行;

index.php<?php

namespace Baijunyao\DesignPatterns\SafeComposite;

require __DIR__.'/../vendor/autoload.php';

/**

* 客戶端

*

* Class Client

* @package Baijunyao\DesignPatterns\SafeComposite

*/

class Client

{

/**

* 運行

*/

public function run()

{

$designPatterns = new Dir('design-patterns');

$classAdapter = new Dir('ClassAdapter');

$objectAdapter = new Dir('ObjectAdapter');

$safeComposite = new Dir('SafeComposite');

$designPatterns->add($classAdapter);

$designPatterns->add($objectAdapter);

$designPatterns->add($safeComposite);

$componentFile = new File('Component.php');

$dirFile = new File('Dir.php');

$fileFile = new File('File.php');

$indexFile = new File('index.php');

$safeComposite->add($componentFile);

$safeComposite->add($dirFile);

$safeComposite->add($fileFile);

$safeComposite->add($indexFile);

echo $designPatterns->display();

}

}

$client = new Client();

$client->run();

運行結果是這個樣子的;

我們看一眼 UML ;

再回頭看下 File.php ;

File 作為葉子其下是不能再有子節點的;

但是為了讓樹枝節點和葉子能有一個統一的操作;

我們在抽象類 Component.php 中定義了 add 方法;

作為示例為了簡化只寫了個 add 配套的 remove 等都沒寫;

這種方式是透明了卻不安全;

我們又不得不在 File 的 add 方法中拋出錯誤;

總結

以上是生活随笔為你收集整理的php 组合模式,php设计模式(十三)透明组合模式的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。