设计模式C#实现(十一)——组合模式
意图
将对象组合成树形结构以表示“部分-整体”的层次结构。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();
}
}
运行结果
效果
- 定义了包含基本对象(不含子节点)和组合对象(含有子节点)的类层次结构
- 简化客户代码 客户不要关心使用的是组合对象和基本对象,因为使用方法是一致的
- 容易增加新组件
- 使设计跟加一般化
设计模式C#实现(十一)——组合模式的更多相关文章
- 设计模式(七)组合模式Composite(结构型)
设计模式(七)组合模式Composite(结构型) 1. 概述 在数据结构里面,树结构是很重要,我们可以把树的结构应用到设计模式里面. 例子1:就是多级树形菜单. 例子2:文件和文件夹目录 2.问题 ...
- Java设计模式(8)组合模式(Composite模式)
Composite定义:将对象以树形结构组织起来,以达成“部分-整体” 的层次结构,使得客户端对单个对象和组合对象的使用具有一致性. Composite比较容易理解,想到Composite就应该想到树 ...
- 设计模式(十)组合模式(Composite Pattern)
一.引言 在软件开发过程中,我们经常会遇到处理简单对象和复合对象的情况,例如对操作系统中目录的处理就是这样的一个例子,因为目录可以包括单独的文件,也可以包括文件夹,文件夹又是由文件组成的,由于简单对象 ...
- js设计模式(六)---组合模式
组合模式将对象组合成树形结构,以表示“部分-整体”的层次结构.除了用来表示树形结构之外,组合模式的另一个好处是通过对象的多态性表现,使得用户对单个对象和组合对象的使用具有一致性.基本图例 1.组合模式 ...
- 设计模式08: Composite 组合模式(结构型模式)
Composite 组合模式(结构型模式) 对象容器的问题在面向对象系统中,我们常会遇到一类具有“容器”特征的对象——即他们在充当对象的同时,又是其他对象的容器. public interface I ...
- 设计模式-(11)组合模式 (swift版)
一,概念 组合模式(Composite Pattern),又叫部分整体模式,是用于把一组相似的对象当作一个单一的对象.组合模式依据树形结构来组合对象,用来表示部分以及整体层次.这种类型的设计模式属于结 ...
- Delphi 设计模式:《HeadFirst设计模式》Delphi2007代码---组合模式之Menus[转]
1 2{<HeadFirst设计模式>之组合模式 } 3{ 组合与单项的抽象父类 } 4{ 编译工具:Delphi2007 for win32} 5{ E-M ...
- 设计模式(十)——组合模式(HashMap源码解析)
1 看一个学校院系展示需求 编写程序展示一个学校院系结构:需求是这样,要在一个页面中展示出学校的院系组成,一个学校有多个学院, 一个学院有多个系.如图: 2 传统方案解决学校院系展示 3 传统方案解决 ...
- javascript设计模式学习之十——组合模式
一.组合模式定义及使用场景 组合模式将对象组合成树形结构,用以表示“部分—整体”的层次结构,除了用来表示树形结构之外,组合模式还可以利用对象的多态性表现,使得用户对单个对象和组合对象的使用具有一致性. ...
- js设计模式(4)---组合模式
0.前言 今天是建党节,新疆那边又开始了闹腾.作为立志成为码农的我,现在已经从一个大愤青淡化为一个小愤青,对这些国家民生大事不在血气喷发,转而把经历发泄在技术问题上面,因而在扯一篇随笔吧,把无处发泄的 ...
随机推荐
- 设置Xshell中支持中文
执行echo $LANG命令输出的是当前的编码方式,执行locale命令得到系统中所有可用的编码方式.要让Xshell不显示乱码,则要将编码方式改为UTF-8. 在Xshell中[file]-> ...
- [moka同学笔记]Yii2 数据操作Query Builder
Query Builder [php] view plain copy $rows = (new \yii\db\Query()) ->select(['dyn_id', 'dyn_name ...
- puporwindow
//Java代码private void showPopupWindow(View view) { // 一个自定义的布局,作为显示的内容 View contentView = LayoutInfla ...
- selenium webdriver读取excel进行数据驱动测试
最近做自动化需要从文件读取数据做参数化,网上发现一个不错的解决方案. 准备:新建一个excel文件,文件名为测试类名,sheet名为测试方法名 excel第一行为标题,从第二行开始为测 ...
- linux非常用但很有用的命令
查找指定目录下包含指定字符串的所有文件 grep -rl 'abc' / top查看命令的完整启动路径 top 按c top以MB为单位显示内存信息 top -M 查看内存top io趋势 pidst ...
- 使用 WSO2 API Manager 管理 Rest API
WSO2 API Manager 简介 随着软件工程的增多,越来越多的软件提供各种不同格式.不同定义的 Rest API 作为资源共享,而由于这些 API 资源的异构性,很难对其进行复用.WSO2 A ...
- ASP.NET根据URL生成网页缩略图示例程序(C#语言)
工作中可能马上要用到根据URL生成网页缩略图功能,提前做好准备. 在网上找了份源码,但是有错误:当前线程不在单线程单元中,因此无法实例化 ActiveX 控件“8856f961-340a-11d0-a ...
- JavaScript学习(3):函数式编程
在这篇文章里,我们讨论函数式编程. 什么是函数式编程?根据百度百科的描述,“函数式编程是种编程典范,它将电脑运算视为函数的计算.函数编程语言最重要的基础是 λ 演算(lambda calculus). ...
- C#如何用delegate实现Javascript的each方法
C#中有很多易混淆的关键词,例如delegate,Func, Action和 Predicate.Func, Action和 Predicate本质上都是delegate,下面看一下delegate概 ...
- vs2010 未能将脚本调试器附加到计算机上的进程。已附加了一个调试器
图片: 上周不小心升级了IE10,今天,VS2010报:未能将脚本调试器附加到计算机XXX上的进程iexplore.exe . 已附加了一个调试器”.启动调试失败. 到网上查找解决办法,最后用这个解决 ...