C# 组合模式构建树形结构,实现多级指令菜单模式

使用场景

图形界面库在图形界面开发中,UI 元素(按钮、文本框等)和容器元素(面板、窗口等)可以使用组合模式来构建复杂的用户界面。这样,可以统一处理单个元素和组合元素,使得客户端代码更简洁

文件系统和目录结构文件系统是一个经典的组合模式应用场景。文件夹可以包含文件和其他文件夹,形成一个树形结构。通过组合模式,可以一致地处理文件和文件夹,而不必在客户端代码中区分它们

组织架构和人员管理:在组织架构中,部门可以包含员工和其他部门,形成一个层次结构。通过组合模式,可以一致地管理单个员工和组合部门,简化组织管理的代码。

菜单和菜单项:菜单系统通常包含菜单项和子菜单,可以使用组合模式来构建菜单层次结构。这样,可以一致地处理单个菜单项和包含子菜单的菜单

----实现指令菜单模式,新建ICommand.cs(接口),Command.cs(子叶),CommandManage.cs(复合叶),main窗体

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace WinFormsApp8
{
    internal interface ICommand
    {
        Guid Guid { get; set; }  
        String Name { get; set; }
        void Execute();
    }
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace WinFormsApp8
{
    internal class Command : ICommand
    {
        private Guid _guid;

        private string _name;

        Guid ICommand.Guid { get => _guid; set => _guid = value; }
        string ICommand.Name { get => _name; set => _name = value; }

        public void Execute()
        {
            _action();
        }

        private Action _action;

        public Command(string guid,string name, Action action)
        {
            _guid = new Guid(guid);
            _name= name;
            _action = action;
        }
    }
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace WinFormsApp8
{
    internal class CommandManage : ICommand
    {
        public Dictionary<string, ICommand> Commands = new Dictionary<string, ICommand>();
        private Action _action;
        private Guid _guid;
        private string _name;
        Guid ICommand.Guid { get => new Guid(); set => _guid = value; }
        string ICommand.Name { get => _name; set => _name = value; }
        public CommandManage(string guid, string name, Action action)
        {
            _guid = new Guid(guid);
            _name = name;
            _action = action;
        }
        public void Execute()
        {
           _action();   
        }

        public void Add(ICommand imd)
        {
            Commands[imd.Guid.ToString()] = imd;
        }

        public void Del(ICommand imd)
        {
            if (Commands.ContainsKey(imd.Guid.ToString())) Commands.Remove(imd.Guid.ToString());
        }
    }
}
        private void Form1_Load(object sender, EventArgs e)
        {
            CommandManage cmds = new CommandManage("96498A68-F01D-4DCC-B786-BFCB6C250A6A", "root", null);
            cmds.Add(new Command("96498A68-F01D-4DCC-B786-BFCB6C250A63", "leaf",null));
            cmds.Add(new Command("96498A68-F01D-4DCC-B786-BFCB6C250A61", "leaf", null));
            var leafq = new CommandManage("96498A68-F01D-4DCC-B786-BFCB6C250A93", "leaf", null);
            cmds.Add(leafq);
            leafq.Add(new Command("96498A68-F01D-4DCC-B786-BFCB6C250A65", "leaf", null));
            leafq.Add(new Command("96498A68-F01D-4DCC-B786-BFCB6C250A67", "leaf", null));
            var mm = cmds;
        }

 

posted @ 2024-03-24 16:30  木狼  阅读(142)  评论(0编辑  收藏  举报