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

      

  • 相关阅读:
    Gerrit配置--用户配置
    repo+manifests+git方式管理安卓代码
    FLASH OTP
    Wireshark抓包分析TCP协议
    python 批量修改图片大小
    python 文件查找 glob
    python 统计单词个数
    python 图片上添加数字源代码
    python 删除文件和文件夹
    python 程序列表
  • 原文地址:https://www.cnblogs.com/itfenqing/p/7788130.html
Copyright © 2020-2023  润新知