设计模式C#实现(十一)——组合模式

      • 意图
        0
      • 适用性
        1
      • 结构
        2
      • 实现
        3
      • 效果
        4

意图

将对象组合成树形结构以表示“部分-整体”的层次结构。Composite使得用户对单个对象和组合对象的使用具有一致性。

适用性

  • 你想表示对象的部分-整体层次结构
  • 你希望用户忽略组合对象与单个对象的不同,用户将统一地使用组合结构中的所有对象。

结构

实现

我们实现一个菜单结构,一个菜单可以包含子菜单或者菜单项

定义一个抽象类,菜单和菜单项都继承自这个类

public abstract class MenuComponet
    {
        public virtual void Add(MenuComponet menuComponet)
        {
            throw new Exception("不支持该方法");
        }

        public virtual void Remove(MenuComponet menuComponet)
        {
            throw new Exception("不支持该方法");
        }

        public virtual MenuComponet GetChild(int i)
        {
            throw new Exception("不支持该方法");
        }

        public virtual void Print()
        {
            throw new Exception("不支持该方法");
        }

    }

菜单包含一个子节点列表

   public class Menu : MenuComponet
    {
        List<MenuComponet> _componets = new List<MenuComponet>();
        private string _name;

        public Menu(string name)
        {
            _name = name;
        }

        public override void Add(MenuComponet menuComponet)
        {
            _componets.Add(menuComponet);
        }

        public override void Remove(MenuComponet menuComponet)
        {
            _componets.Remove(menuComponet);
        }

        public override MenuComponet GetChild(int i)
        {
            return _componets[i];
        }

        public override void Print()
        {
            Console.WriteLine(_name+":");
            foreach (var c in _componets)
            {
                Console.Write("--");
                c.Print();
            }
        }
    }

菜单项

 public class MenuItem : MenuComponet
    {
        private string _name;
        private float _price;

        public MenuItem(string name, float price)
        {
            _name = name;
            _price = price;
        }

        public override void Print()
        {
            Console.WriteLine("--"+_name + ": " + _price + "$");
        }
    }

客户使用

 class Program
    {
        static void Main(string[] args)
        {
            MenuComponet allMenus = new Menu("Menu");
            MenuComponet breakfast = new Menu("breakfast");
            MenuComponet lunch = new Menu("lunch");
            MenuComponet dinner = new Menu("dinner");

            breakfast.Add(new MenuItem("Milk", 1.5f));
            breakfast.Add(new MenuItem("Egg", .5f));

            lunch.Add(new MenuItem("Hamburger", 3f));
            lunch.Add(new MenuItem("Sausage", 3f));
            lunch.Add(new MenuItem("French fries", 2f));

            MenuComponet food = new Menu("Food");
            MenuComponet drink = new Menu("Drink");

            food.Add(new MenuItem("Steak", 6f));
            food.Add(new MenuItem("Salad", 3f));
            food.Add(new MenuItem("Hamburger", 3f));
            drink.Add(new MenuItem("Beer", 1f));
            drink.Add(new MenuItem("Wine", 3f));
            dinner.Add(food);
            dinner.Add(drink);

            allMenus.Add(breakfast);
            allMenus.Add(lunch);
            allMenus.Add(dinner);
            allMenus.Print();

            Console.WriteLine("\n I wanna a beer");
            allMenus.GetChild(2).GetChild(1).GetChild(0).Print();
            Console.ReadKey();
        }
    }

运行结果

效果

  • 定义了包含基本对象(不含子节点)和组合对象(含有子节点)的类层次结构
  • 简化客户代码 客户不要关心使用的是组合对象和基本对象,因为使用方法是一致的
  • 容易增加新组件
  • 使设计跟加一般化
时间: 2024-11-05 20:47:13

设计模式C#实现(十一)——组合模式的相关文章

设计模式 3 —— 迭代器和组合模式

设计模式目录: 设计模式 1 ——观察者模式 设计模式 2 —— 装饰者模式 设计模式 3 —— 迭代器和组合模式 概要 设计模式 3 -- 迭代器和组合模式

设计模式(七)组合模式Composite(结构型)

设计模式(七)组合模式Composite(结构型) 1. 概述 在数据结构里面,树结构是很重要,我们可以把树的结构应用到设计模式里面. 例子1:就是多级树形菜单. 例子2:文件和文件夹目录 2.问题 我们可以使用简单的对象组合成复杂的对象,而这个复杂对象有可以组合成更大的对象.我们可以把简单这些对象定义成类,然后定义一些容器类来存储这些简单对象.客户端代码必须区别对象简单对象和容器对象,而实际上大多数情况下用户认为它们是一样的.对这些类区别使用,使得程序更加复杂.递归使用的时候跟麻烦,而我们如何

设计模式(9)--迭代器与组合模式

(1)散列表(hashtable)         共迭代器获取 hashtable.values().iterator();  因为每一笔数据都是由键值对组成. (2)迭代器是用来遍历集合的. Java5后集合都出了自己的遍历方式 如增加for循环.           遍历 也称 游走... (3)数组:Array 长定固定   集合:ArrayList 可扩展,取数据不需要转型 (4)Java中有自己的迭代器接口.在java.util.Iterator  . (5)集合:collectio

设计模式08: Composite 组合模式(结构型模式)

Composite 组合模式(结构型模式) 对象容器的问题在面向对象系统中,我们常会遇到一类具有“容器”特征的对象——即他们在充当对象的同时,又是其他对象的容器. public interface IBox { void Process(); } public class SingleBox:IBox { public void Process(){...} } public class ContainerBox:IBox { public void Process(){...} public

设计模式学习笔记之组合模式

组合模式 允许你将对象组合成树形结构来表现“整体/部分”层次结构.组合能让客户以一致的方式处理个别对象以及对象组合. 使用组合结构,我们能把相同的操作应用在组合和个别对象上.换句话说,在大多数情况下,我们可以忽略对象组合和个别对象之间的差别. 说明: 1.组合模式使添加或者删除子节点变得容易: 场景: 1.想要标识对象的部分-整体结构: 2.想要客户端忽略组合对象和个体对象的差异,客户端将统一使用组合结构中的所有对象: /** * 为组合中所有对象定义一个接口,不管是组合还是节点 * */ pu

设计模式(结构型)之组合模式(Composite Pattern)

PS一句:最终还是选择CSDN来整理发表这几年的知识点,该文章平行迁移到CSDN.因为CSDN也支持MarkDown语法了,牛逼啊! [工匠若水 http://blog.csdn.net/yanbober] 阅读前一篇<设计模式(结构型)之桥接模式(Bridge Pattern)> http://blog.csdn.net/yanbober/article/details/45366781 概述 组合模式又叫做部分-整体模式,使我们在树型结构的问题中模糊简单元素和复杂元素的概念,客户程序可以像

Delphi 设计模式:《HeadFirst设计模式》Delphi2007代码---组合模式之Menus[转]

 1 2{<HeadFirst设计模式>之组合模式 } 3{ 组合与单项的抽象父类           } 4{ 编译工具:Delphi2007 for win32} 5{ E-Mail :[email protected]   } 6 7unit uMenuComponent; 8 9interface1011uses12  SysUtils;1314type15  TMenuComponent = class abstract(TObject)16  public17    procedu

javascript设计模式学习之十——组合模式

一.组合模式定义及使用场景 组合模式将对象组合成树形结构,用以表示“部分—整体”的层次结构,除了用来表示树形结构之外,组合模式还可以利用对象的多态性表现,使得用户对单个对象和组合对象的使用具有一致性. 实现组合模式的关键: 在java等静态语言中,需要单个对象和组合对象都实现同样的抽象接口,这可以通过抽象类或者接口来实现. 在javascript中,对象的多态性是与生俱来的,没有编译器去检查对象的类型,因此实现组合模式的要点是保证组合兑现个单个对象用友同样的方法,这通常需要使用“鸭子类型”的思想

设计模式 --&gt; (8)组合模式

组合模式 组合模式,是为了解决整体和部分的一致对待的问题而产生的,要求这个整体与部分有一致的操作或行为.部分和整体都继承与一个公共的抽象类,这样,外部使用它们时是一致的,不用管是整体还是部分,使用一个方法即可遍历整体中的所有的部分.就像一个树形结构一样. 适用性 常用于组织结构,产品结构之类的整体和部分的结构.例如图形由很多直线构成,直线由点构成,这就是整体和部分的关系.如果采用组合模式,只需要使用一个draw方法即可按遍历的方式画出所有的点,最终呈现出来的就是图形. 优点: 隐藏了整体和部分,

设计模式(八)组合模式

使用组合模式的场景:把部分和整体的关系用树形结构来表示,从而使客户端可以使用统一的方式处理部分对象和整体对象. 组合模式核心: 抽象构件(Component)角色:定义了叶子和容器构件的共同点. 叶子(Leaf)构件角色:无子节点. 容器(Composite)构件角色:有容器特征,可以包含子节点. 组合模式工作流程分析: 组合模式为处理树形结构提供了完美的解决方案,描述了如何将容器和叶子进行递归组合,使得用户在使用时可以一致性的对待容器和叶子. 当容器对象的指定方法被调用时,将遍历整个树形结构,