Skip to content

Instantly share code, notes, and snippets.

@code-atom
Created November 4, 2016 13:35
Show Gist options
  • Save code-atom/6988cc63ff9f776964c12ba7fde55912 to your computer and use it in GitHub Desktop.
Save code-atom/6988cc63ff9f776964c12ba7fde55912 to your computer and use it in GitHub Desktop.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Series
{
public class SubMenuBuilder
{
private ISubMenuHolder parentMenu;
public SubMenuBuilder(ISubMenuHolder menu)
{
parentMenu = menu;
}
public SubMenuBuilder AddSubMenu(string name)
{
var menu = new SimpleSubMenu { Name = name };
menu.ParentId = ((Menu)parentMenu).Id;
parentMenu.AddSubMenu(menu);
return this;
}
public NestedSubMenuBuilder AddSubModule(string name)
{
var menu = new NestedSubMenu { Name = name };
menu.ParentId = ((Menu)parentMenu).Id;
parentMenu.AddSubMenu(menu);
return new NestedSubMenuBuilder(this, menu);
}
public class NestedSubMenuBuilder
{
private SubMenuBuilder holder;
private ISubMenuHolder parentMenu;
public NestedSubMenuBuilder(SubMenuBuilder _holder, ISubMenuHolder _menu)
{
holder = _holder;
parentMenu = _menu;
}
public NestedSubMenuBuilder AddSubMenu(string name)
{
var menu = new SimpleSubMenu { Name = name };
menu.ParentId = ((Menu)parentMenu).Id;
parentMenu.AddSubMenu(menu);
return this;
}
public NestedSubMenuBuilder AddSubModule(string name)
{
var menu = new NestedSubMenu { Name = name };
menu.ParentId = ((Menu)parentMenu).Id;
parentMenu.AddSubMenu(menu);
return new NestedSubMenuBuilder(new SubMenuBuilder(parentMenu), menu);
}
public SubMenuBuilder Build()
{
return holder;
}
}
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace Series
{
public class TopMenu : Menu , ISubMenuHolder
{
public TopMenu()
{
SubMenus = new List<SubMenu>();
}
public void AddSubMenu(SubMenu menu)
{
SubMenus.Add(menu);
}
public List<SubMenu> SubMenus
{
get;
set;
}
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace Series
{
public abstract class SubMenu : Menu
{
public Guid ParentId
{
get;
set;
}
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Series
{
public class MenuDemo
{
public static void Main(string[] args)
{
var builder = new MenuBuilder();
builder.AddMenu("Top1")
.AddSubMenu("Top1 -> Sub Menu 1")
.AddSubModule("Top1 -> SubModuleMenu 1")
.AddSubMenu("Top1 -> SubModule 1 -> Menu 1")
.AddSubMenu("Top1 -> SubModule 1 -> Menu 2")
.AddSubModule("Top1 -> SubModule 1 -> SubModuleMenu 1")
.AddSubMenu("Top1 -> SubModule 1 -> SubModule 1 -> Menu 1")
.AddSubMenu("Top1 -> SubModule 1 -> SubModule 1 -> Menu 2")
.AddSubMenu("Top1 -> SubModule 1 -> SubModule 1 -> Menu 3")
.Build()
.AddSubMenu("Top1 -> SubModule 1 -> Menu 3")
.AddSubMenu("Top1 -> SubModule 1 -> Menu 4")
.AddSubMenu("Top1 -> SubModule 1 -> Menu 5");
}
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Series
{
public class MenuBuilder
{
List<Menu> menus = new List<Menu>();
public SubMenuBuilder AddMenu(string name)
{
var mainMenu = new TopMenu { Name = name };
menus.Add(mainMenu);
return new SubMenuBuilder(mainMenu);
}
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace Series
{
public interface ISubMenuHolder
{
List<SubMenu> SubMenus
{
get;
set;
}
void AddSubMenu(SubMenu menu);
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace Series
{
public class SimpleSubMenu : SubMenu
{
}
public class NestedSubMenu : SubMenu , ISubMenuHolder
{
public NestedSubMenu()
{
SubMenus = new List<SubMenu>();
}
public List<SubMenu> SubMenus
{
get;
set;
}
public void AddSubMenu(SubMenu menu)
{
SubMenus.Add(menu);
}
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace Series
{
public abstract class SubMenu : Menu
{
public Guid ParentId
{
get;
set;
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment