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);
    

      

  • 相关阅读:
    Windows server 2016 解决“无法完成域加入,原因是试图加入的域的SID与本计算机的SID相同。”
    Windows Server 2016 辅助域控制器搭建
    Windows Server 2016 主域控制器搭建
    Net Framework 4.7.2 覆盖 Net Framework 4.5 解决办法
    SQL SERVER 2012更改默认的端口号为1772
    Windows下彻底卸载删除SQL Serever2012
    在Windows Server2016中安装SQL Server2016
    SQL Server 创建索引
    C#控制台或应用程序中两个多个Main()方法的设置
    Icon cache rebuilding with Delphi(Delphi 清除Windows 图标缓存源代码)
  • 原文地址:https://www.cnblogs.com/itfenqing/p/7788130.html
Copyright © 2011-2022 走看看