我正在尝试使用多个多级子菜单(路径类型菜单)实现复杂的控制台菜单。也许有人建议在我的情况下使用什么设计模式?
顶部菜单示例
* 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 + 一些树遍历的混合体。为此,我们需要:
一个基类 BaseCommand,用于对菜单中的每个命令进行建模。
派生自 BaseCommand 的基类 Command 用于执行某些逻辑的菜单项 - 用于树中的叶子。
派生自 BaseCommand 的基类 CompositeCommand 用于带有子命令的命令。此类将具有 Children 属性,该属性将存储 BaseCommand 类型的对象。
可以执行某些逻辑的每个命令,例如虚拟服务器 #1 应派生自 Command。
每个有子命令的命令,例如List Virtual Servers 应该派生自 CompositeCommand。
在您的程序开始时,您应该创建一个命令树。在您的例子中,我们将在这棵树的根部找到主菜单。 Main Menu 的 Children 属性将包含对List Virtual Servers、List Image Templates、退出等等。
此解决方案的最后一部分是经理。经理是一个类,必须跟踪我们在树中的位置。当管理器收到来自用户的输入时,他可以做 3 件事:如果它是一个叶子,则执行当前命令;如果用户选择返回,则移动到当前命令的父级;移动到一个当前命令的子命令(如果有的话)。
关于c# - 在控制台应用程序中实现导航菜单,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24859559/