php 组合模式,php设计模式(十三)透明组合模式
組合模式用來解決整體和部分可以一致對待的問題;
比如說 文件夾 和其下的 文件;
可以復制文件也可以復制整個文件夾;
組合模式是將對象組合成樹形結構以表示整體和部分的層次結構;
可以方便的增加節(jié)點;
組合模式分為兩種;透明模式
安全模式
我們先來說透明組合模式;
結構
Component:包含樹枝節(jié)點和葉子節(jié)點方法的抽象類
Composite:樹枝節(jié)點 有子節(jié)點 示例中指 Dir 文件夾
Leaf:葉子節(jié)點 沒有子節(jié)點 示例中指 File 文件
示例
包含樹枝節(jié)點和葉子節(jié)點方法的抽象類
Component.php<?php
namespace Baijunyao\DesignPatterns\SafeComposite;
/**
* 包含樹枝節(jié)點和葉子節(jié)點方法的抽象類
*
* 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 = [];
/**
* 添加子節(jié)點
*
* @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('文件不能添加子節(jié)點');
}
/**
* @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 作為葉子其下是不能再有子節(jié)點的;
但是為了讓樹枝節(jié)點和葉子能有一個統(tǒng)一的操作;
我們在抽象類 Component.php 中定義了 add 方法;
作為示例為了簡化只寫了個 add 配套的 remove 等都沒寫;
這種方式是透明了卻不安全;
我們又不得不在 File 的 add 方法中拋出錯誤;
總結
以上是生活随笔為你收集整理的php 组合模式,php设计模式(十三)透明组合模式的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: “小牛说车”侵犯
- 下一篇: 广汽埃安昊铂 HT 车型 11 月 15