PHP设计模式(十二)组合模式的实现
一、什么是组合模式(Composite Pattern)
1)组合模式又叫部分整体模式,用于把一组相似的对象当作一个单一的对象。
2)组合模式依据树形结构来组合对象,用来表示部分以及整体层次,如 公司组织架构,省份所辖城市
二、组合模式结构
组合部件(Component):它是一个抽象角色,为要组合的对象提供统一的接口
叶子(Leaf):在组合中表示子节点对象,叶子节点不能有子节点
合成部件(Composite):定义有枝节点的行为,用来存储部件,实现在Component接口中的有关操作,如增加(Add)和删除(Remove)
三、组合模式使用场景
1)表达对象的部分-整体的层次结构时
2)希望用户忽略组合对象与单个对象的不同,用户将统一地使用组合结构中的所有对象时
四、组合模式优缺点
优点:
1)组合模式使得客户端代码可以一致地处理对象和对象容器,无需关系处理的单个对象,还是组合的对象容器
2)将”客户代码与复杂的对象容器结构“解耦
3)可以更容易地往组合对象中加入新的构件。
缺点:
使得设计更加复杂。客户端需要花更多时间理清类之间的层次关系。
五、代码实现
Component.php // 抽象接口,定义实现
<?php
/**
* 组合部件抽象角色,为要组合的对象提供统一的接口
* 管理子对象方法,如增加、删除
*/
abstract class Component
{
// 节点名称
protected $name;
// 初始化节点名称
public function __construct($name)
{
$this->name = $name;
}
// 添加节点
abstract public function add(Component $component);
// 显示节点
abstract public function show($depth);
}
Composite.php // 枝节点
<?php
/**
* 合成部件,定义枝节点行为,存储部件
*/
class Composite extends Component
{
// 存储枝节点和叶节点
private $children = [];
// 实现节点添加
public function add(Component $component)
{
$this->children[] = $component;
}
// 显示节点
public function show($depth)
{
$name = str_repeat('-' , $depth) . $this->name . '<br>';
foreach($this->children as $v){
$name .= str_repeat('-' , $depth) . $v->show($depth + 2);
}
return $name;
}
}
Leaf.php 叶子节点
<?php
/**
* 叶子节点
*/
class Leaf extends Component
{
// 叶子节点没有子节点,禁止叶子节点添加子节点
public function add(Component $component)
{
echo '不能添加节点';
}
// 显示节点
public function show($depth)
{
return str_repeat('-' , $depth) . $this->name . '<br>';
}
}
index.php // 客户端
<?php
include './Component.php';
include './Composite.php';
include './Leaf.php';
class index
{
public static function idx()
{
$company = new Composite('国汽北京总部');
$shCompany = new Composite('国汽上海分公司');
$zjCompany = new Composite('国汽浙江分公司');
$company->add($shCompany);
$company->add($zjCompany);
$shSonCompany = new Leaf('徐汇区国汽第三分公司');
$shCompany->add($shSonCompany);
$zjSonCompany = new Leaf('杭州国汽第一分公司');
$zjCompany->add($zjSonCompany);
echo $company->show(0);
}
}
index::idx();
// 输出结果
国汽北京总部
--国汽上海分公司
------徐汇区国汽第三分公司
--国汽浙江分公司
------杭州国汽第一分公司
我是夕阳何处寻,期待和优秀的你一起同行!
夕阳何处寻
2020年04月18日
请登录后再评论