设计模式——组合模式
2016-04-18 17:46
204 查看
将对象组合成树形结构以表示“部分-整体”的层次结构,组合模式使得用户对单个对象和组合对象的使用具有一致性。掌握组合模式的重点是要理解清楚 “部分/整体” 还有 ”单个对象“ 与 "组合对象" 的含义。Composite模式使得用户对单个对象和组合对象的使用具有一致性。
效果及实现要点
1、Composite模式采用树形结构来实现普遍存在的对象容器,从而将“一对多”的关系转化“一对一”的关系,使得客户代码可以一致地处理对象和对象容器,无需关心处理的是单个的对象,还是组合的对象容器。
2、将“客户代码与复杂的对象容器结构”解耦是Composite模式的核心思想,解耦之后,客户代码将与纯粹的抽象接口——而非对象容器的复内部实现结构——发生依赖关系,从而更能“应对变化”。
3、Composite模式中,是将“Add和Remove等和对象容器相关的方法”定义在“表示抽象对象的Component类”中,还是将其定义在“表示对象容器的Composite类”中,是一个关乎“透明性”和“安全性”的两难问题,需要仔细权衡。这里有可能违背面向对象的“单一职责原则”,但是对于这种特殊结构,这又是必须付出的代价。ASP.NET控件的实现在这方面为我们提供了一个很好的示范。
4、Composite模式在具体实现中,可以让父对象中的子对象反向追溯;如果父对象有频繁的遍历需求,可使用缓存技巧来改善效率。
适用性
以下情况下适用Composite模式:
1、你想表示对象的部分-整体层次结构
2、你希望用户忽略组合对象与单个对象的不同,用户将统一地使用组合结构中的所有对象。
2.更容易在组合体内加入对象部件. 客户端不必因为加入了新的对象部件而更改代码。
View Code
效果及实现要点
1、Composite模式采用树形结构来实现普遍存在的对象容器,从而将“一对多”的关系转化“一对一”的关系,使得客户代码可以一致地处理对象和对象容器,无需关心处理的是单个的对象,还是组合的对象容器。
2、将“客户代码与复杂的对象容器结构”解耦是Composite模式的核心思想,解耦之后,客户代码将与纯粹的抽象接口——而非对象容器的复内部实现结构——发生依赖关系,从而更能“应对变化”。
3、Composite模式中,是将“Add和Remove等和对象容器相关的方法”定义在“表示抽象对象的Component类”中,还是将其定义在“表示对象容器的Composite类”中,是一个关乎“透明性”和“安全性”的两难问题,需要仔细权衡。这里有可能违背面向对象的“单一职责原则”,但是对于这种特殊结构,这又是必须付出的代价。ASP.NET控件的实现在这方面为我们提供了一个很好的示范。
4、Composite模式在具体实现中,可以让父对象中的子对象反向追溯;如果父对象有频繁的遍历需求,可使用缓存技巧来改善效率。
适用性
以下情况下适用Composite模式:
1、你想表示对象的部分-整体层次结构
2、你希望用户忽略组合对象与单个对象的不同,用户将统一地使用组合结构中的所有对象。
优点
1.使客户端调用简单,客户端可以一致的使用组合结构或其中单个对象,用户就不必关系自己处理的是单个对象还是整个组合结构,这就简化了客户端代码。2.更容易在组合体内加入对象部件. 客户端不必因为加入了新的对象部件而更改代码。
缺点
组合模式不容易限制组合中的构件。总结
组合模式解耦了客户程序与复杂元素内部结构,从而使客户程序可以向处理简单元素一样来处理复杂元素。实现
完成造人的逻辑后,人分成人、孩子,成人一般都有孩子。这块逻辑用组合模式实现。类图如下:package com.lidaming.design12.composite; public class Client { public static void main(String[] args) { Adult root = new Adult("Mr Li"); IHuman jack=new Child("Jack"); root.add(jack); IHuman tom=new Child("Tom"); root.add(tom); root.display(); } }
View Code
参考
http://terrylee.cnblogs.com/archive/2006/03/11/347919.html http://blog.csdn.net/ai92/article/details/298336相关文章推荐
- C#学习-防止重复运行
- Android 注解的简单使用之省去findViewById()
- sql where
- 团队作业二
- HIVE授权配置
- 简单的zip压缩和解压缩
- 非常好用的Xcode插件(持续更新)
- Spark API(1) 构建hadoop 集群
- 设计一个只能在堆内存上实例化的类和一个只能在栈内存上实例化的类
- View的onMeasure方法
- Java程序的路径问题
- 87.直接向对象发送消息和通过performSelector调用的区别
- java 连接sql server 2008 数据库 笔记
- 简单制作漂亮的照片拼贴文字效果
- iOS大牛博客集
- Jquery如何获得<iframe>嵌套页面中的元素
- eclipse重定向输入输出到文件
- jQuery 序列化表单数据 serialize() serializeArray()
- Windows上使用ionic开发IOS程序
- css选择器