CompositePattern--HeadFirst学习

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、基本类图



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值