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

标签 c# design-patterns console-application

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

顶部菜单示例

* Main Menu *

1. List Virtual Servers
2. List Image Templates
3. Exit

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

* List Virtual Servers *

1. Virtual server #1
2. Virtual server #2
3. Virtual server #3
4. Return

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

* Command for Virtual server #2 *

1. Delete
2. Return

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

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

最佳答案

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

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

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

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

  4. 可以执行某些逻辑的每个命令,例如虚拟服务器 #1 应派生自 Command

  5. 每个有子命令的命令,例如List Virtual Servers 应该派生自 CompositeCommand

  6. 在您的程序开始时,您应该创建一个命令树。在您的例子中,我们将在这棵树的根部找到主菜单Main MenuChildren 属性将包含对List Virtual ServersList Image Templates退出等等。

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

关于c# - 在控制台应用程序中实现导航菜单,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24859559/

相关文章:

c - 检测到堆损坏 | C

c#:生成一个新的单个图像,该图像在水平方向上重复另一个图像 x 次

c# - 如果在 ThreadPool 的线程正在写入文件时应用程序关闭,会发生什么情况?

c# - 在 ContainerControl C#.NET 中检测鼠标位置

c# - 使用装饰器模式有条件地替换行为而不是扩展

C# 使用 RegEx 和字典替换 "Whole words only"

java - 工厂方法模式返回 void

c++ - 无法使用 AMQP-CPP 在 RabbitMQ 服务器上成功发布消息

c# - 收集客户端计算机和浏览器统计信息

c# - 如何设置最小控制台大小 C#?