设计模式C#实现(十一)——结合模式
设计模式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();
}
}
运行结果
效果
- 定义了包含基本对象(不含子节点)和组合对象(含有子节点)的类层次结构
- 简化客户代码 客户不要关心使用的是组合对象和基本对象,因为使用方法是一致的
- 容易增加新组件
- 使设计跟加一般化
- 1楼tkb至简
- 楼主 图看不见哪 都是纯黑的 啥都看不见 你没看到吗
- Re: 妖刀Dreamcast
- @tkb至简,看得到啊
相关推荐
- 浅谈设计模式之代理设计模式 什么是代理模式 为什么使用代理模式 代理模式实现原理 代理模式应用场景 代理模式创建的方式 动态代理 JDK动态代理 CGLIB动态代理 CGLIB原理 Cglib优缺点 CGLIB代理实现 静态代理与动态代理区别 JDK动态代理与CGLIB实现区别 Spring中强制使用CGLIB代理配置
- 如何在聚合支付平台,巧用模板+工厂设计模式来实现异步回调
- 设计模式之外观模式(门面模式)以及如何利用到接口设计中 什么是外观模式 外观模式应用场景 相关代码实现
- 设计模式读书笔记-----中介者模式 一、 模式定义 二、 模式结构 三、 模式实现 四、 模式优缺点 五、 模式适用场景 六、 模式总结
- JAVA面向对象编程之购物车界面的设计与功能的实现 1、小组成员及分工 2、Git 仓库地址 3、界面展示 4、几个亮点功能介绍 5、系统中体现出的MVC模式
- 设计模式之二策略模式(java实现)
- 设计模式之一单例模式(java实现)
- 《基于B_S模式的教务管理系统设计与实现》论文笔记(三)
- C#设计模式(1)——单例模式
- 《javascript设计模式与开放实践》学习(一)javascript实现多态2
- MVVM模式解析和在WPF中的实现(5)View和ViewModel的通信
- 《大话设计模式》学习心得系列(1)