翼度科技»论坛 编程开发 PHP 查看内容

浅谈PHP设计模式的组合模式

8

主题

8

帖子

24

积分

新手上路

Rank: 1

积分
24
简介:

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

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

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

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

如果服务端限制类型时,数据不方便处理。
代码:
  1. // component为组合中的对象接口,在适当的情况下,实现所有类共有接口的默认行为。声明一个接口用于访问和管理Component的字部件。
  2. abstract class Component {
  3.     protected $name;
  4.     function __construct($name) {
  5.         $this->name = $name;
  6.     }
  7.     //通常用add和remove方法来提供增加或移除树枝或树叶的功能
  8.     abstract public function add(Component $c);
  9.     abstract public function remove(Component $c);
  10.     abstract public function display($depth);
  11. }
  12. //透明方式和安全方式的区别就在叶子节点上,透明方式的叶子结点可以无限扩充,然而安全方式就是对其做了绝育限制。
  13. class Leaf extends Component {
  14.     public function add(Component $c) {
  15.         echo "不能在添加叶子节点了\n";
  16.     }
  17.     public function remove(Component $c) {
  18.         echo "不能移除叶子节点了\n";
  19.     }
  20.     // 叶节点的具体方法,此处是显示其名称和级别
  21.     public function display($depth) {
  22.         echo '|' . str_repeat('-', $depth) . $this->name . "\n";
  23.     }
  24. }
  25. //composite用来处理子节点,控制添加,删除和展示(这里的展示可以是任意功能)
  26. class Composite extends Component
  27. {
  28.     //一个子对象集合用来存储其下属的枝节点和叶节点。
  29.     private $children = [];
  30.     public function add(Component $c) {
  31.         array_push($this->children, $c);
  32.     }
  33.     public function remove(Component $c) {
  34.         foreach ($this->children as $key => $value) {
  35.             if ($c === $value) {
  36.                 unset($this->children[$key]);
  37.             }
  38.         }
  39.     }
  40.     public function display($depth) {
  41.         echo str_repeat('-', $depth) . $this->name . "\n";
  42.         foreach ($this->children as $component) {
  43.             $component->display($depth);
  44.         }
  45.     }
  46. }
  47. //客户端代码
  48. //声明根节点
  49. $root = new Composite('根');
  50. //在根节点下,添加叶子节点
  51. $root->add(new Leaf("叶子节点1"));
  52. $root->add(new Leaf("叶子节点2"));
  53. //声明树枝
  54. $comp = new Composite("树枝");
  55. $comp->add(new Leaf("树枝A"));
  56. $comp->add(new Leaf("树枝B"));
  57. $root->add($comp);
  58. $root->add(new Leaf("叶子节点3"));
  59. //添加并删除叶子节点4
  60. $leaf = new Leaf("叶子节点4");
  61. $root->add($leaf);
  62. $root->remove($leaf);
  63. //展示
  64. $root->display(1);
复制代码
来源:https://www.cnblogs.com/phpphp/p/17066566.html
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作!

举报 回复 使用道具