1、组合模式定义
组合模式允许将对象组合成树状结构来表现整体-部分层次结构。组合能让客户以一致的方式处理个别对象和对象组合。
2、要点
组合包含组件,而组件有两种,一种是叶节点元素与组合。组合持有一群孩子,这些孩子可以是别的组合或叶节点元素。当使用这种方式组织数据的时候,最终会得到树形结构,
根部是一个组合,而组合的分支逐渐往下延伸,直至叶节点。
使用组合,我们能把相同的操作用在组合和个别对象上。即在多数情况下,我们可以忽略对象组合和个别对象之间的差异。
3、例子代码
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace ComponentPattern
{
/// <summary>
/// 菜单组件基类
/// </summary>
public abstract class MenuComponent
{
protected string m_name;
protected string m_description;
protected bool m_vegetarian;
protected double m_price;
public virtual void add(MenuComponent component)
{
}
public virtual void remove(MenuComponent component)
{
}
public virtual MenuComponent getChild(int index)
{
return null;
}
public virtual void print()
{
}
}
/// <summary>
/// 菜单项
/// </summary>
public class MenuItem : MenuComponent
{
public MenuItem(string name,string description,bool vegetarian,double price)
{
m_name = name;
m_description = description;
m_price = price;
m_vegetarian = vegetarian;
}
public override void print()
{
Console.WriteLine(string.Format("name = {0};description = {1},price = {2},vegetarian = {3}", m_name,
m_description, m_price, m_vegetarian));
}
}
/// <summary>
/// 菜单
/// </summary>
public class Menu : MenuComponent
{
private List<MenuComponent> m_Componentlist;
public Menu(string name, string description, bool vegetarian, double price)
{
m_name = name;
m_description = description;
m_price = price;
m_vegetarian = vegetarian;
m_Componentlist = new List<MenuComponent>();
}
public override void add(MenuComponent component)
{
m_Componentlist.Add(component);
}
public override void remove(MenuComponent component)
{
m_Componentlist.Remove(component);
}
public override MenuComponent getChild(int index)
{
return m_Componentlist[index];
}
public override void print()
{
if (m_Componentlist.Count == 0)
return;
foreach (var component in m_Componentlist)
{
component.print();
}
}
}
/// <summary>
/// 服务员
/// </summary>
public class Waitress
{
private MenuComponent m_MenuComponent;
public Waitress(MenuComponent component)
{
m_MenuComponent = component;
}
public void printMenu()
{
m_MenuComponent.print();
}
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace ComponentPattern
{
class Program
{
static void Main(string[] args)
{
MenuComponent pSubMenu1 = new Menu("组合子菜单1", "早餐组合菜单", false, 300);
pSubMenu1.add(new MenuItem("小煎饼", "小呀小煎饼", false, 100));
pSubMenu1.add(new MenuItem("中煎饼", "中呀中煎饼", false, 200));
pSubMenu1.add(new MenuItem("大煎饼", "大呀大煎饼", false, 250));
MenuComponent pSubMenu2 = new Menu("组合子菜单2", "必胜客豪华午餐", false, 400);
pSubMenu2.add(new MenuItem("披萨", "超级至尊", true, 150));
pSubMenu2.add(new MenuItem("披萨", "美式精选", true, 200));
pSubMenu2.add(new MenuItem("披萨", "夏威夷风光", false, 100));
MenuComponent pSubMenu21 = new Menu("组合子菜单2的子菜单", "饮料午餐子菜单", false, 400);
pSubMenu21.add(new MenuItem("芒果冰沙", "芒果冰沙", false, 30));
pSubMenu21.add(new MenuItem("特浓冻奶茶", "特浓冻奶茶", false, 30));
pSubMenu21.add(new MenuItem("九珍果珍", "九珍果珍", false, 30));
pSubMenu2.add(pSubMenu21);
MenuComponent pSubMenu3 = new Menu("组合子菜单3", "晚餐的组合菜单", false, 500);
pSubMenu3.add(new MenuItem("咖啡", "咖啡", false, 30));
pSubMenu3.add(new MenuItem("蛋糕", "false", true, 30));
MenuComponent pAllMenu = new Menu("组合菜单","最全的组合菜单",false,1000);
pAllMenu.add(pSubMenu1);
pAllMenu.add(pSubMenu2);
pAllMenu.add(pSubMenu3);
Waitress pWaitress = new Waitress(pAllMenu);
pWaitress.printMenu();
}
}
}
4、基本类图