zoukankan      html  css  js  c++  java
  • S6:组合模式 Composite

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

    UML:

    示例代码:
    透明组合:叶节点和子节点具有相同的接口

    abstract class Component
    {
        protected $name;
    
        public function __construct($name)
        {
            $this->name = $name;
        }
    
        abstract public function add(Component $node);
        abstract public function remove(Component $node);
        abstract public function display($deep);
    }
    
    // 页节点
    class Leaf extends Component
    {
        public function add(Component $node)
        {
            // 叶不能添加节点
        }
    
        public function remove(Component $node)
        {
            // 叶不能删除节点
        }
    
        public function display($deep)
        {
            echo str_repeat('-', $deep) . $this->name . PHP_EOL;
        }
    
    }
    
    // 枝节点
    class Composite extends Component
    {
        protected $nodes = array();
    
        public function add(Component $node)
        {
            $this->nodes[] = $node;
        }
    
        public function remove(Component $node)
        {
            unset($this->nodes[array_search($node, $this->nodes)]);
        }
    
        public function display($deep)
        {
            echo str_repeat('-', $deep) . $this->name . PHP_EOL;
    
            foreach ($this->nodes as $node)
            {
                $node->display($deep + 2);
            }
        }
    
    }
    
    
    $root = new Composite('/root');
    $root->add(new Leaf('/a.txt'));
    $root->add(new Leaf('/b.txt'));
    
    $etc = new Composite('/etc');
    $etc->add(new Leaf('httpd'));
    $etc->add(new Leaf('nginx'));
    
    $root->add($etc);
    $root->display(2);
    

      

    示例代码:
    安全组合:接口中不强制实现增加和删除节点,叶节点不具备该两项功能.

    abstract class Component
    {
        protected $name;
    
        public function __construct($name)
        {
            $this->name = $name;
        }
    
        abstract public function display($deep);
    }
    
    // 页节点
    class Leaf extends Component
    {
        public function display($deep)
        {
            echo str_repeat('-', $deep) . $this->name . PHP_EOL;
        }
    
    }
    
    // 枝节点
    class Composite extends Component
    {
        protected $nodes = array();
    
        public function add(Component $node)
        {
            $this->nodes[] = $node;
        }
    
        public function remove(Component $node)
        {
            unset($this->nodes[array_search($node, $this->nodes)]);
        }
    
        public function display($deep)
        {
            echo str_repeat('-', $deep) . $this->name . PHP_EOL;
    
            foreach ($this->nodes as $node)
            {
                $node->display($deep + 2);
            }
        }
    
    }
    
    
    $root = new Composite('/root');
    $root->add(new Leaf('/a.txt'));
    $root->add(new Leaf('/b.txt'));
    
    $etc = new Composite('/etc');
    $etc->add(new Leaf('httpd'));
    $etc->add(new Leaf('nginx'));
    
    $root->add($etc);
    $root->display(2);
    

      

  • 相关阅读:
    实现Promise的first等各种变体
    js打乱数组的实战应用
    Vue单页面中进行业务数据的上报
    如何实现一个楼中楼的评论系统
    vue实现对表格数据的增删改查
    用CSS3实现无限循环的无缝滚动
    使用vue实现tab操作
    redis事务与关系型数据库事务比较
    优先队列原理与实现
    MySQL排序原理与案例分析
  • 原文地址:https://www.cnblogs.com/itfenqing/p/7788130.html
Copyright © 2011-2022 走看看