2014-07-21 109 views
0

我試圖用多個多級子菜單(路徑類型菜單)實現複雜的控制檯菜單。也許有人建議在我的情況下使用什麼樣的設計模式?頂部菜單在控制檯應用程序中實現導航菜單

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

回答

1

我的想法是將菜單項的層次結構建模爲樹,並在用戶瀏覽菜單時遍歷此樹。從設計模式的角度來看,它將是Composite和Command +某些樹遍歷的混合。爲了做到這一點,我們需要:

  1. 的基類BaseCommand在你的菜單中的每個命令的模型。

  2. 甲基類命令BaseCommand衍生針對執行一些邏輯菜單項 - 用於在樹葉。

  3. 甲基類CompositeCommandBaseCommand衍生有子女的命令。這個班級將有子女屬性將存儲類型的基類命令的對象。

  4. 每個可執行某些邏輯的命令例如虛擬服務器#1應該來自命令

  5. 每個有孩子的命令例如列表虛擬服務器應衍生自CompositeCommand

  6. 在程序開始時,您應該創建一個命令樹。在你的案例中,我們會發現主菜單主菜單兒童屬性將包含列表虛擬服務器列表圖像模板,等退出命令引用。

  7. 該解決方案的最後一部分是經理。經理是一個必須保持我們在樹中的位置的類。當管理員接收到用戶的輸入時,他可以做3件事情:如果它是一片葉子,則執行當前命令,如果用戶選擇返回,移動到當前命令的父親,移動到當前命令的子項如果它有一個。

1

我寫了a console menu這可能對你有用。

CMenu是一個輕量級,低規格的框架,用於在.Net中構建控制檯菜單。您不必手動提示用戶輸入並解析它,而是以簡短,結構化和全面的方式定義命令,並讓CMenu處理剩下的命令。

CMenu旨在降低開銷 - 簡單的東西應該很容易實現。如果您不使用某項功能,則無需瞭解任何相關信息。

與此同時,支持複雜的場景。大菜單可以很容易地分成幾個類。背景自我配置。您不必擔心大菜單中涉及的所有令人討厭的細節,它只會起作用。

最重要的是,它使用起來非常簡單快捷。命令可以縮寫,智能解析器甚至可以進行部分匹配。幫助命令已集成。

它沒有考慮到這種操作風格編號寫的,但它可以被模仿,如果你命名的命令「1.富」應該很好地工作,「二欄」等

繼承系統非常簡單(只需從CMenuItem派生並覆蓋Execute),或者如果你想要的話,甚至可以直接使用lambda表達式。

var menu = new CMenu(); 
menu.Add ("1. foo", s => Console.WriteLine ("Foo!")); 
menu.Add ("2. bar", s => Console.WriteLine ("Bar!")); 
menu.Run(); 

菜單樹支持得很好,請參閱this page for examples。作爲一個例子(還有其他的方法來創建分層菜單):

var m = new CMenu() { 
    new CMenuItem ("1") { 
     new CMenuItem ("1", s => Console.WriteLine ("1-1")), 
     new CMenuItem ("2", s => Console.WriteLine ("1-2")), 
    }, 
    new CMenuItem ("2") { 
     new CMenuItem ("1", s => Console.WriteLine ("2-1")), 
     new CMenuItem ("2", s => Console.WriteLine ("2-2")), 
    }, 
}; 

更新:通過單一的數字按鍵選擇將被包含在本地下一個版本(0.8)。

相關問題