首页IT科技php 设计模式 鸟哥(浅谈PHP设计模式的组合模式)

php 设计模式 鸟哥(浅谈PHP设计模式的组合模式)

时间2025-06-20 08:14:59分类IT科技浏览4295
导读:简介: 组合模式,属于结构型的设计模式。将对象组合成树形结构以表示“部分-整体”的层次结构。组合模式使得用户对单个对象和组合对象的使用具有一致性。 组合模式分两种状态: 透明方式,子类的所有接口一致,使其叶子节点和枝节点对外界没有区别。 安全方式,子类接口不一致,只...

简介:

组合模式            ,属于结构型的设计模式            。将对象组合成树形结构以表示“部分-整体            ”的层次结构                     。组合模式使得用户对单个对象和组合对象的使用具有一致性      。

组合模式分两种状态: 透明方式                     ,子类的所有接口一致      ,使其叶子节点和枝节点对外界没有区别         。 安全方式         ,子类接口不一致                     ,只实现特定的接口                     。 适用场景:

希望客户端可以忽略组合对象与单个对象的差异          ,进行无感知的调用          。

优点:

让客户端忽略层次之间的差异      ,方便对每个层次的数据进行处理      。

缺点:

如果服务端限制类型时                    ,数据不方便处理                    。

代码: // component为组合中的对象接口              ,在适当的情况下   ,实现所有类共有接口的默认行为              。声明一个接口用于访问和管理Component的字部件   。 abstract class Component { protected $name; function __construct($name) { $this->name = $name; } //通常用add和remove方法来提供增加或移除树枝或树叶的功能 abstract public function add(Component $c); abstract public function remove(Component $c); abstract public function display($depth); } //透明方式和安全方式的区别就在叶子节点上                   ,透明方式的叶子结点可以无限扩充                  ,然而安全方式就是对其做了绝育限制                   。 class Leaf extends Component { public function add(Component $c) { echo "不能在添加叶子节点了\n"; } public function remove(Component $c) { echo "不能移除叶子节点了\n"; } // 叶节点的具体方法,此处是显示其名称和级别 public function display($depth) { echo | . str_repeat(-, $depth) . $this->name . "\n"; } } //composite用来处理子节点               ,控制添加                     ,删除和展示(这里的展示可以是任意功能) class Composite extends Component { //一个子对象集合用来存储其下属的枝节点和叶节点                  。 private $children = []; public function add(Component $c) { array_push($this->children, $c); } public function remove(Component $c) { foreach ($this->children as $key => $value) { if ($c === $value) { unset($this->children[$key]); } } } public function display($depth) { echo str_repeat(-, $depth) . $this->name . "\n"; foreach ($this->children as $component) { $component->display($depth); } } } //客户端代码 //声明根节点 $root = new Composite(); //在根节点下   ,添加叶子节点 $root->add(new Leaf("叶子节点1")); $root->add(new Leaf("叶子节点2")); //声明树枝 $comp = new Composite("树枝"); $comp->add(new Leaf("树枝A")); $comp->add(new Leaf("树枝B")); $root->add($comp); $root->add(new Leaf("叶子节点3")); //添加并删除叶子节点4 $leaf = new Leaf("叶子节点4"); $root->add($leaf); $root->remove($leaf); //展示 $root->display(1);

创心域SEO版权声明:以上内容作者已申请原创保护,未经允许不得转载,侵权必究!授权事宜、对本内容有异议或投诉,敬请联系网站管理员,我们将尽快回复您,谢谢合作!

展开全文READ MORE
美国vps综合论坛超级vps管理器(租用美国站群服务器需要考虑哪几个方面问题) 如何优化单页面网站的SEO?(让你的单页网站更好地被搜索引擎收录)