C#面向对象设计模式第九讲:Composite 组合模式(结构型模式)
(根据MSDN Webcast相关课程整理)
由俄罗斯套娃讲起。娃娃里又包含另一个娃娃,最后那个不包含任何娃娃。
组合模式,采用树型结构来实现普遍存在的对象容器,将本原一对多的复杂的关系,转换成一对一的简单关系,从而可以一致的处理一批对象,使得客户程序不需要关心对象内容的具体实现。
将客户程序与对象内部实现解耦,是组合模式的核心思想。解耦后,客户程序只能对象上层的接口发生关系。
一种不好的设计方案:
把一对多的关系暴露给外界,客户程序即要处理一对一的关系,又要处理一对多的关系。
改进之后的方案,采用Composite设计模式:
提升容器对象特有的方法到父类中,从面确保客户程序可以采用一致的方案来处理对象。另外,在Process方法中完成两件事:
1, 完成自身的处理事务;
2, 循环处理所包含的子对象中的事件。
这就将原来在客户程序中递归调用的任务转移到了对象内部的循环调用。大大减少的耦合关系和代码的复杂度。
注:示例代码中使用了Add与Remove方面来完成对包含成员的操作,推荐使用UML图中的方法:使用IList来管理对象,从而自动实现Add与Remove等操作方法。
常见的类似结构的菜单,窗口,以及ASP.Net中的控件结构等。
转载于:https://www.cnblogs.com/luckeryin/archive/2011/12/26/2302188.html
C#面向对象设计模式第九讲:Composite 组合模式(结构型模式)相关推荐
- [导入]C#面向对象设计模式纵横谈(10):Decorator 装饰模式(结构型模式).zip(9.84 MB)...
讲座内容: 本培训课程探讨GoF23之Decorator 装饰模式的意图.动因.原理.应用场景与C#语言实现,以及该模式在.NET框架程序设计中的具体应用. 课程讲师: 李建忠 上海祝成信息科技有限公 ...
- 享元模式 - 结构型模式
模式类型: Flyweight 享元模式 - 结构型模式 意图: The intent of this pattern is to use sharing to support a ...
- Java设计模式学习总结(14)——结构型模式之代理模式
在代理模式(Proxy Pattern)中,一个类代表另一个类的功能.这种类型的设计模式属于结构型模式.在代理模式中,我们创建具有现有对象的对象,以便向外界提供功能接口. 介绍 意图:为其他对象提供一 ...
- 【设计模式】设计模式总结 ( 七大设计原则 | 创建型模式 | 结构型模式 | 行为型模式 ) ★★★
文章目录 一.七大设计原则 1.开闭原则 2.依赖倒置原则 3.单一职责原则 4.接口隔离原则 5.迪米特原则 6.里氏替换原则 7.合成复用原则 二.创建型模式 0.简单工厂模式 ( 不属于 GOF ...
- 设计模式09: Decorator 装饰模式(结构型模式)
Decorator 装饰模式(结构型模式) 子类复子类,子类何其多 加入我们需要为游戏中开发一种坦克,除了不同型号的坦克外,我们还希望在不同场合中为其增加以下一种多种功能:比如红外线夜视功能,比如水路 ...
- Java设计模式学习总结(13)——结构型模式之享元模式
享元模式(Flyweight Pattern)主要用于减少创建对象的数量,以减少内存占用和提高性能.这种类型的设计模式属于结构型模式,它提供了减少对象数量从而改善应用所需的对象结构的方式.享元模式尝试 ...
- Java设计模式学习总结(12)——结构型模式之外观模式
外观模式(Facade Pattern)隐藏系统的复杂性,并向客户端提供了一个客户端可以访问系统的接口.这种类型的设计模式属于结构型模式,它向现有的系统添加一个接口,来隐藏系统的复杂性. 这种模式涉及 ...
- Java设计模式学习总结(11)——结构型模式之装饰器模式
装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其结构.这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装.这种模式创建了一个装饰类,用来包装原 ...
- Java设计模式学习总结(9)——结构型模式之过滤器模式(标准模式)
过滤器模式( Filter Pattern )或标准模式(Criteria Pattern)是一种设计模式,这种模式允许开发人员使用不同的标准来过滤一组对象,通过逻辑运算以解耦的方式把它们连接起来.这 ...
- Java设计模式学习总结(8)——结构型模式之桥接模式
桥接(Bridge )是用于把抽象化与实现化解耦,使得二者可以独立变化.这种类型的设计模式属于结构型模式,它通过提供抽象化和实现化之间的桥接结构,来实现二者的解耦.这种模式涉及到一个作为桥接的接口,使 ...
最新文章
- Ext.widgets-Button,SplitButton,CycleButton
- 非等高cell实战(01)-- 实现微博页面
- python快速安装pip
- Python入门 [输出,注释,列表,元祖,集合,字典,if,while,for]
- ASP.NET MVC 3.0学习系列文章--Razor and ASP.NET MVC 3.0
- linux刷新jdk,Linux安装更新JDK
- APL开发日志--2012-11-14
- word 多级编号列表
- UE4遇到的各种奇葩问题
- Android Audio音量设置流程
- 只用十行 Python 代码就提取了韦小宝的身份证信息
- 确定项目的目的和目标
- 前端应届生如何做一个职业规划?已拿offer附真题解析
- JavaWeb web.xml配置详解
- 大学生创业知识(转)
- STM32F4XX的DFU功能
- FreeMind:简单粗暴完成一份思维导图
- 基于微信小程序的科普之家小程序-计算机毕业设计
- “-MyBeijing-”:北京120个场所开通免费WiFi
- 电压跟随器加电阻分压实现降压
热门文章
- 深入理解const char*p,char const*p,char *const p,const char **p,char const**p,char *const*p,char**const
- C++中public,protected,private派生类继承问题和访问权限问题
- linux监控哪些目录,linux管理文件和目录的命令
- python中np没有定义_python中的np.empty_python – np.empty,np.zeros和np.one
- php取掉字符串第一位支付,php怎样去掉字符串中的第一个字符
- python关闭浏览器删除session_Django操作session 的方法
- Tensorflow 指令加速
- Date类+DateFormat
- GXU - 7D - 区间求和 - 前缀和
- MarkDown语法-使用博客园的markDown编辑