• 设计模式 - 组合模式理解及示例


    组合模式

    组合模式(Composite Pattern),又叫部分整体模式,是用于把一组相似的对象当作一个单一的对象。组合模式依据树形结构来组合对象,用来表示部分以及整体层次。这种类型的设计模式属于结构型模式,它创建了对象组的树形结构。

    这种模式创建了一个包含自己对象组的类。该类提供了修改相同对象组的方式。

    示例 - 导航菜单

    每个菜单都有自己的属性(包含:icon、名称、链接、子菜单)
    设计一个菜单类

    setName($name);
        }
    
        public function addMenu(Menu $menu)
        {
            array_push($this->items,$menu);
        }
    
        public function setName(string $name)
        {
            $this->name = $name;
        }
    
        public function display()
        {
            dd($this);
        }
    	
    	//菜单转数组
        public function toArray() : array
        {
            $data = [
                'name'  =>  $this->getName()
            ];
            if(!empty($this->url))
                $data['url'] = $this->getUrl();
            if(!empty($this->icon))
                $data['icon']= $this->getIcon();
    
            if(!empty($this->items))
            {
                $data['menus'] = [];
                foreach($this->items as $item)
                {
                    array_push($data['menus'],$item->toArray());
                }
            }
    
            return $data;
        }
    
        /**
         * @return string
         */
        public function getIcon(): string
        {
            return $this->icon;
        }
    
        /**
         * @param string $icon
         */
        public function setIcon(string $icon): void
        {
            $this->icon = $icon;
        }
    
        /**
         * @return string
         */
        public function getUrl(): string
        {
            return $this->url;
        }
    
        /**
         * @param string $url
         */
        public function setUrl(string $url): void
        {
            $this->url = $url;
        }
    
        /**
         * @return array
         */
        public function getItems(): array
        {
            return $this->items;
        }
    
        /**
         * @param array $items
         */
        public function setItems(array $items): void
        {
            $this->items = $items;
        }
    
        public function getName() : string
        {
            return $this->name;
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89
    • 90
    • 91
    • 92
    • 93
    • 94
    • 95
    • 96
    • 97
    • 98
    • 99
    • 100
    • 101
    • 102
    • 103
    • 104
    • 105
    • 106
    • 107
    • 108
    • 109
    • 110
    • 111
    • 112
    • 113
    • 114
    • 115
    • 116
    • 117

    接下来我们开始组装菜单。在组装前我们先定义一个菜单配置,声明菜单与菜单之间的关系

    //菜单配置
    public function getMenuData()
    {
        return [
            'name'      =>  '菜单',
            'menus'     =>  [
                [
                    'name'  =>  '系统设置',
                    'icon'  =>  'aaa',
                    'menus' =>  [
                        [
                            'name'  =>  '文件上传配置',
                            'url'   =>  '1',
                            'icon'  =>  '123'
                        ],
                        [
                            'name'  =>  '系统设置',
                            'url'   =>  '2',
                            'icon'  =>  '123'
                        ],
                        [
                            'name'  =>  '支付设置',
                            'url'   =>  '3',
                            'icon'  =>  '123'
                        ],
                        [
                            'name'  =>  '网站设置',
                            'url'   =>  '4',
                            'icon'  =>  '123'
                        ]
                    ]
                ],
                [
                    'name'  =>  "用户管理",
                    'icon'  =>  'bbb',
                    'menus' =>  [
                        [
                            'name'  =>  '粉丝管理',
                            'url'   =>  '5'
                        ],
                        [
                            'name'  =>  '商户管理',
                            'url'   =>  '6'
                        ]
                    ]
                ],
                [
                    'name'  =>  '应用管理',
                    'icon'  =>  'ccc',
                    'menus' =>  [
                        [
                            'name'  =>  '秒杀',
                            'url'   =>  '7'
                        ],
                        [
                            'name'  =>  '砍价',
                            'url'   =>  '8'
                        ],
                    ]
                ]
            ]
        ];
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63

    组装菜单

    //组装菜单方法
    public function structMenu(array &$menuConfig) : Menu
    {
    	if(!isset($menuConfig['name']))
    	    throw new \Exception("not get name",101);
    	
    	$menu = new Menu($menuConfig['name']);
    	
    	//属性
    	if(isset($menuConfig['url']))
    	    $menu->setUrl($menuConfig['url']);
    	
    	//属性
    	if(isset($menuConfig['icon']))
    	    $menu->setIcon($menuConfig['icon']);
    	
    	//子菜单
    	if(isset($menuConfig['menus']) && !empty($menuConfig['menus']))
    	{
    	    foreach($menuConfig['menus'] as $childrenMenuConfig)
    	    {
    	        $menu->addMenu($this->structMenu($childrenMenuConfig));
    	    }
    	}
    
       return $menu;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    public function index16()
    {
    	//获取菜单配置
    	$menuConfig = $this->getMenuData();
    	
    	//根据菜单配置组装菜单
    	$menu = $this->structMenu($menuConfig);
    	
    	//打印菜单
    	dd($menu->toArray());
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
  • 相关阅读:
    剑指 Offer II 062. 实现前缀树-字母串树
    linux删除某个文件夹下的某个固定文件
    C++ 访问说明符详解:封装数据,控制访问,提升安全性
    37-5 基于时间的盲注 SQL 注入 PoC 的 Python 编写
    驱动有没有(静态和动态加载)
    数据结构-----排序的概念、常见排序的实现以及排序算法的特点、非比较排序、排序相关例题
    实践编程是巩固Java所学知识的重要方式
    猿创征文 | 《深入浅出Vue.js》打卡Day5
    【超全】React学习笔记 中:进阶语法与原理机制
    推荐一款管理系统专用 低 代码工具,一天开发一个系统不是梦
  • 原文地址:https://blog.csdn.net/u014559227/article/details/126259547