Composite pattern
组合模式
From Wikipedia, the free encyclopedia
In computer science
, the composite pattern
is a partitioning design pattern
.
Composite allows a group of objects to be treated in the same way as a
single instance of an object. The intent of composite is to "compose
objects into tree structures to represent part-whole hierarchies.
Composite lets clients treat individual objects and compositions
uniformly."
在计算机科学中,组合模式
是一种分离的设计模式。组合允许一组对象当作一个对象的单独的实例,采用统一的处理法方式来进行处理。组合的意图是把对象组装成树形的结构来代表 部分-整体的层次结构。组合让客户可以采用统一的方式来处理不同的对象和组件。
<script type="text/javascript"><!----></script>
动机
When dealing with tree-structured data, programmers often have to
discriminate between a leaf-node and a branch. This makes code more
complex, and therefore, error prone. The solution is an interface that
allows treating complex and primitive objects uniformly. In object-oriented programming
,
a composite is an object (e.g., a shape) designed as a composition of
one-or-more similar objects (other kinds of shapes/geometries), all
exhibiting similar functionality. This is known as a "has-a
"
relationship between objects. The key concept is that you can
manipulate a single instance of the object just as you would a group of
them. The operations you can perform on all the composite objects often
have a least common denominator
relationship. For example, if defining a system to portray grouped
shapes on a screen, it would be useful to define resizing a group of
shapes to have the same effect (in some sense) as resizing a single
shape.
当处理树形结构的数据的时候,程序员经常需要花时间在节点到底是叶节点还是枝节点上进行区分。这样导致的问题就是代码更加复杂,也因为这样,导致了更多的错误。这个解决方案的就是一个接口,允许统一的处理那些复杂的或简单的对象。在面向对象中,一个组件是一个对象(比喻说是一个形状),它是一个或多个相似类型对象的集合(其他的形状),这些对象之间享有类似的功能。这就是总所周知的对象之间的“has-a”关系。这个模式的最大的好处就在于你可以处理一个对象,就跟处理多个对象一样。你需要在所有的组件对象上做的操作拥有一个最小的公分母,比喻说,如果定义一个系统来自屏幕上绘制成组的形状,那么下面的方式更好一些,定义一组形状有统一的改变大小的方法(某种意义上)的,就如同改变一个形状的大小。
何时实用
Composite can be used when clients should ignore the difference between compositions of objects and individual objects.[1]
If programmers find that they are using multiple objects in the same
way, and often have nearly identical code to handle each of them, then
composite is a good choice; it is less complex in this situation to
treat primitives and composites as homogeneous.
组合模式适用于下面的情况,当用户需要忽略多个不同的对象和一个单独对象之间的不同。当一个程序员发现,他在不停的使用一个方法访问不同的对象,而且经常的使用近乎同样的方法来处理他们,这个时候,组合就是一个很好的选择;使用组合可以更简单的处理简单的同类对象的组合。
结构
Composite pattern in
UML
.
组件
- 所有组件的一个抽象,包括组合的那些
- 定义了组合中所有的对象的接口
- 适当的实现对应所有的类的针对接口的默认行为
- 定义一个简单来访问和管理他们的孩子组件
- (可选的) 定义一个接口来递归的访问它的父亲节点,如果方便的话
叶子
组合
- 代表一个组合组件(组件有孩子节点)
- 实现方法去操作孩子节点
- 实现所有的组件方法,通常情况下代理给他们的孩子节点
例子
Java
下面的例子,使用Java编写,实现了一个图形类,它可能是一个椭圆或者是一个多个图形的集合,每一个图形都是可以打印的。
import java.util.List;
import java.util.ArrayList;
/** "Component" */
interface
Graphic {
//Prints the graphic.
public void print();
}
/** "Composite" */
class CompositeGraphic implements Graphic {
//Collection of child graphics.
private List<Graphic> mChildGraphics = new ArrayList<Graphic>();
//Prints the graphic.
public void print() {
for (Graphic graphic : mChildGraphics) {
graphic.print();
}
}
//Adds the graphic to the composition.
public void add(Graphic graphic) {
mChildGraphics.add(graphic);
}
//Removes the graphic from the composition.
public void remove(Graphic graphic) {
mChildGraphics.remove(graphic);
}
}
/** "Leaf" */
class Ellipse implements Graphic {
//Prints the graphic.
public void print() {
System.out.println("Ellipse");
}
}
/** Client */
public class Program {
public static void main(String[] args) {
//Initialize four ellipses
Ellipse ellipse1 = new Ellipse();
Ellipse ellipse2 = new Ellipse();
Ellipse ellipse3 = new Ellipse();
Ellipse ellipse4 = new Ellipse();
//Initialize three composite graphics
CompositeGraphic graphic = new CompositeGraphic();
CompositeGraphic graphic1 = new CompositeGraphic();
CompositeGraphic graphic2 = new CompositeGraphic();
//Composes the graphics
graphic1.add(ellipse1);
graphic1.add(ellipse2);
graphic1.add(ellipse3);
graphic2.add(ellipse4);
graphic.add(graphic1);
graphic.add(graphic2);
//Prints the complete graphic (four times the string "Ellipse").
graphic.print(); }
}
分享到:
相关推荐
首先,大规模协作是新组织结构的核心,它打破了传统的专职翻译、众包翻译和兼职翻译的界限,引入了组合式创新的概念。专职翻译保持专业水准,众包翻译利用大众智慧,兼职翻译则提供灵活资源,三者结合可以快速响应...
- **Composite Pattern(组合模式)**:将对象组合成树形结构以表示部分-整体层次结构。 - **适配器模式**:允许不兼容的接口之间可以协同工作。 - **观察者模式**:在对象之间定义一对多的依赖关系,当一个对象的...
【标题】和【描述】提及的是“基于情感词组合模式的情感细分类研究”,这是一项针对中文微博情感分析的学术研究。研究重点在于如何利用情感词典和情感词的组合模式来对微博短文本进行情感细分类,以提高情感分析的...
结构型模式关注如何组合类和对象以达到特定目的,如适配器模式、装饰器模式等;行为型模式关注对象间的行为分配,如观察者模式、策略模式等。 3. **移动设备的特殊性**:移动设备有其独特性,比如屏幕尺寸有限、...
2.2.3 组合模式 27 2.3 格式化 27 2.3.1 封装格式化算法 27 2.3.2 Compositor和Composition 27 2.3.3 策略模式 29 2.4 修饰用户界面 29 2.4.1 透明围栏 29 2.4.2 Monoglyph 30 2.4.3 Decorator 模式 32 2.5 支持多种...
9. **组合模式**:允许你将对象组合成树形结构来表现“整体/部分”层次结构,使用户对单个对象和组合对象的使用具有一致性。 10. **装饰器模式**:在不改变对象自身的基础上,在运行时给对象添加新的行为或责任。 ...
组合模式将对象组合成树形结构以表示“部分-整体”的层次结构。例如,为MM挑选生日礼物时,可能会选择一件T恤、一条裙子和一个包包,这三个单独的物品可以组合成一个礼物套装,这样既满足了MM的需求,又保持了整体的...
8. 组合模式(Composite Pattern):允许你将对象组合成树形结构来表现“部分-整体”的层次结构。在Delphi中,可以使用TComponent和TCollection来实现组合模式。 9. 代理模式(Proxy Pattern):为其他对象提供一种...
2. **结构型模式**:这类模式关注如何组合现有组件,如代理模式、装饰器模式、适配器模式、桥接模式、组合模式和外观模式。代理模式为其他对象提供一种代理以控制对这个对象的访问;装饰器模式可以在不改变原有对象...
从创建型模式(如工厂模式、建造者模式)到结构型模式(如适配器模式、组合模式),再到行为型模式(如观察者模式、策略模式),每种模式都有其独特的应用场景和优点。掌握这些设计模式不仅有助于我们编写出更高质量...
这时,你可以把这些物品看作是一个整体——一套礼物,这就是组合模式的应用。该模式通过树状结构来组织对象,使得客户端可以一致地对待单个对象和组合对象。 **9. 装饰器模式(Decorator)** 装饰器模式就像是在...
比如,Mary生日时想要一件T恤、一条裙子和一个包包,这些单品可以看作是组合模式中的叶子节点,而整体套装则是组合模式中的树枝节点。 **优点**: - 易于扩展,可以方便地增加新的部件。 - 统一处理整体与部分的...
组合模式将对象组合成树形结构以表示“部分-整体”的层次结构。它使得客户可以一致地使用单个对象和组合对象。 **应用场景:** 当你需要表示对象的部分整体层次结构时,可以使用组合模式。 **优点:** - 用户无须...
《深入设计模式》是一部由亚历山大·什韦茨所著、彭力翻译的作品,旨在通过深入浅出的方式介绍设计模式的相关内容。该书不仅包含了面向对象程序设计的基础知识,还详细探讨了设计模式的概念及其应用价值,同时介绍了...
一般而言,用户可以通过在拨号界面输入特定的组合键来激活这个模式,如“*#*#7378423#*#*”或“*#6673#”。然而,这种方法并非适用于所有诺基亚手机,因此建议查阅具体型号的官方文档或在线资源获取准确的进入方式。...
8. **组合模式**:组合模式允许你将对象组合成树状结构,以表示“部分-整体”的层次结构。例如,MM挑选T恤、裙子和包,组合成一套礼物,组合模式使得你可以把单个组件和组合组件同样对待。 9. **装饰器模式**:装饰...