在控制台应用程序中实现导航菜单

Tom*_*mas 3 c# design-patterns console-application

我正在尝试使用多个多级子菜单(路径类型菜单)来实现复杂的控制台菜单。也许有人建议在我的情况下使用什么设计模式?

顶部菜单示例

* Main Menu *

1. List Virtual Servers
2. List Image Templates
3. Exit
Run Code Online (Sandbox Code Playgroud)

例如,如果选择 1,则会出现下一个子菜单

* List Virtual Servers *

1. Virtual server #1
2. Virtual server #2
3. Virtual server #3
4. Return
Run Code Online (Sandbox Code Playgroud)

例如,如果选择 2,则会出现下一个子菜单

* Command for Virtual server #2 *

1. Delete
2. Return
Run Code Online (Sandbox Code Playgroud)

我当前的导航代码如下,这仅适用于第一个顶部菜单,不确定如何实现多级路径类型菜单,并通过菜单进行完整的上下导航。

static void Main(string[] args)
{

    Console.WriteLine("1. List Virtual Servers" +
       Environment.NewLine + "2. List Image Templates" +
       Environment.NewLine + "3. Exit");

    var input = Console.ReadKey();
    var key = input.KeyChar;
    int value;
    if (int.TryParse(key.ToString(), out value))
    {
        Console.WriteLine();
        RouteChoice(value);
    }
    else
    {
        Console.WriteLine("Invalid Entry.");
    }

    Console.Write("Press any key to exit...");
    Console.ReadKey(false);

    Console.ReadLine();

}

private static void RouteChoice(int menuChoice)
{
    switch (menuChoice)
    {
        case 1:
            GetVirtualServers();
            break;
        case 2:
            GetImageTemplate();
            break;                
        default:
            Console.WriteLine("Invalid Entry!");
            break;
    }
}
Run Code Online (Sandbox Code Playgroud)

Mic*_*ski 5

我的想法是将菜单项的层次结构建模为树,并在用户浏览菜单时遍历该树。从设计模式的角度来看,它将是复合和命令+一些树遍历的混合。为此,我们需要:

  1. 一个基类BaseCommand,用于对菜单中的每个命令进行建模。

  2. BaseCommand派生的基类Command,用于执行某些逻辑的菜单项 - 对于树中的叶子。

  3. BaseCommand派生的基类CompositeCommand,用于带有子项的命令。此类将具有Children属性,该属性将存储BaseCommand类型的对象。

  4. 每个可以执行某些逻辑的命令(例如Virtual server #1)都应该从Command派生。

  5. 每个具有子命令(例如列出虚拟服务器)的命令都应该派生自CompositeCommand

  6. 在程序开始时,您应该创建一个命令树。在您的情况下,在这棵树的根目录中,我们将找到Main Menu主菜单的 Children 属性将包含对列出虚拟服务器列出图像模板退出等命令的引用。

  7. 该解决方案的最后一部分是管理器。管理器是一个必须跟踪我们在树中位置的类。当管理器收到用户的输入时,他可以做 3 件事:如果当前命令是叶子,则执行当前命令;如果用户选择 Return,则移动到当前命令的父级;如果用户选择返回,则移动到当前命令的子级有一个。