组合模式
要点:组合模式提供一个结构,可同时包容组合对象与个别对象。
组合模式容许客户对个别对象以及组合对象一视同仁。
组合结构内的任意对象成为组件。组件可以是组合,也可以是叶节点。
下面是组合模式的例子:
class Program
{
static void Main(string[] args)
{
//定义早餐====================================================================
MenuComponent menu = new Menu("早餐", "新鲜的早餐");
MenuComponent menuItem1 = new MenuItem("牛奶", "牛奶description", false, 3.0);
MenuComponent menuItem2 = new MenuItem("油条", "油条description", false, 1.0);
MenuComponent menuItem3 = new MenuItem("馒头", "馒头description", true, 1.0);
MenuComponent menuItem4 = new MenuItem("豆浆", "DoujiangDescription", true, 1.5);
menu.Add(menuItem1);
menu.Add(menuItem2);
menu.Add(menuItem3);
menu.Add(menuItem4);
//定义午餐====================================================================
MenuComponent lunch = new Menu("午餐", "包括下午茶");
MenuComponent lunch1=new MenuItem("香菇豆腐饭", "香菇豆腐", false, 10.5);
MenuComponent lunch2 = new MenuItem("蛋炒饭", "哈哈", false, 8.5);
MenuComponent lunch3 = new MenuItem("鱼香肉丝", "你猜", true, 15.5);
MenuComponent tea = new Menu("下午茶", "新鲜的下午茶");
MenuComponent tea1 = new MenuItem("香蕉片", "香蕉片", true, 10);
MenuComponent tea2 = new MenuItem("咖啡", "大杯的哦", true, 10);
tea.Add(tea1);
tea.Add(tea2);
lunch.Add(lunch1);
lunch.Add(lunch2);
lunch.Add(lunch3);
lunch.Add(tea);
//定义三餐====================================================================
MenuComponent food = new Menu("三餐", "三餐列表");
food.Add(menu);
food.Add(lunch);
food.Print();
Console.ReadKey();
}
}
/// <summary>
/// 菜单组件
/// </summary>
public abstract class MenuComponent
{
public abstract void Add(MenuComponent menucomponent);
public abstract void Remove(MenuComponent menucomponent);
public abstract MenuComponent GetChild(int i);
public abstract string GetDescription();
public abstract string GetName();
public abstract double GetPrice();
public abstract bool IsVegetarian();
public abstract void Print();
}
public class MenuItem:MenuComponent
{
private string name;
private string description;
private bool vegetarin;
private double price;
public MenuItem(string name, string description, bool vegetarin, double price)
{
this.name = name;
this.description = description;
this.vegetarin = vegetarin;
this.price = price;
}
public override string GetName()
{
return name;
}
public override double GetPrice()
{
return price;
}
public override bool IsVegetarian()
{
return vegetarin;
}
public override string GetDescription()
{
return description;
}
public override void Print()
{
Console.Write(""+GetName()+",");
if (IsVegetarian())
{
Console.Write("(素) ,");
}
Console.Write(GetPrice()+