Tom*_*mas 3 c# design-patterns console-application
我正在尝试使用多个多级子菜单(路径类型菜单)来实现复杂的控制台菜单。也许有人建议在我的情况下使用什么设计模式?
顶部菜单示例
Run Code Online (Sandbox Code Playgroud)* Main Menu * 1. List Virtual Servers 2. List Image Templates 3. Exit
例如,如果选择 1,则会出现下一个子菜单
Run Code Online (Sandbox Code Playgroud)* List Virtual Servers * 1. Virtual server #1 2. Virtual server #2 3. Virtual server #3 4. Return
例如,如果选择 2,则会出现下一个子菜单
Run Code Online (Sandbox Code Playgroud)* 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;
}
}
Run Code Online (Sandbox Code Playgroud)
我的想法是将菜单项的层次结构建模为树,并在用户浏览菜单时遍历该树。从设计模式的角度来看,它将是复合和命令+一些树遍历的混合。为此,我们需要:
一个基类BaseCommand,用于对菜单中的每个命令进行建模。
从BaseCommand派生的基类Command,用于执行某些逻辑的菜单项 - 对于树中的叶子。
从BaseCommand派生的基类CompositeCommand,用于带有子项的命令。此类将具有Children属性,该属性将存储BaseCommand类型的对象。
每个可以执行某些逻辑的命令(例如Virtual server #1)都应该从Command派生。
每个具有子命令(例如列出虚拟服务器)的命令都应该派生自CompositeCommand。
在程序开始时,您应该创建一个命令树。在您的情况下,在这棵树的根目录中,我们将找到Main Menu。主菜单的 Children 属性将包含对列出虚拟服务器、列出图像模板、退出等命令的引用。
该解决方案的最后一部分是管理器。管理器是一个必须跟踪我们在树中位置的类。当管理器收到用户的输入时,他可以做 3 件事:如果当前命令是叶子,则执行当前命令;如果用户选择 Return,则移动到当前命令的父级;如果用户选择返回,则移动到当前命令的子级有一个。