一、介绍
组合模式主要用于具有父子关系,或局部-整体关系的情况下。此模式使局部对象和组合对象的使用具有一致性,或者说,我们可以用一个类来统一表示一个对象或组合对象。
二、实例
首先,定义一个抽象的基类,其中定义了局部对象和组合对象的一些基本元素。
import java.util.LinkedList;
import java.util.ListIterator;
public abstract class TeaBags {
LinkedList teaBagList;
TeaBags parent;
String name;
public abstract int countTeaBags();
public abstract boolean add(TeaBags teaBagsToAdd);
public abstract boolean remove(TeaBags teaBagsToRemove);
public abstract ListIterator createListIterator();
public void setParent(TeaBags parentIn) {
parent = parentIn;
}
public TeaBags getParent() {
return parent;
}
public void setName(String nameIn) {
name = nameIn;
}
public String getName() {
return name;
}
}
此段代码中,包含了组合信息的List对象(表示整体)和上下关联的parent对象(指示局部-整体的关系)。
现在,我们基于以上类,定义一个局部对象,其基本定义如下:
import java.util.ListIterator;
public class OneTeaBag extends TeaBags {
public OneTeaBag(String nameIn) {
this.setName(nameIn);
}
public int countTeaBags() {
return 1;
}
public boolean add(TeaBags teaBagsToAdd) {
return false;
}
public boolean remove(TeaBags teaBagsToRemove) {
return false;
}
public ListIterator createListIterator() {
return null;
}
}
然后,定义个一组合对象,定义如下:
import java.util.LinkedList;
import java.util.ListIterator;
public class TinOfTeaBags extends TeaBags {
public TinOfTeaBags(String nameIn) {
teaBagList = new LinkedList();
this.setName(nameIn);
}
public int countTeaBags() {
int totalTeaBags = 0;
ListIterator listIterator = this.createListIterator();
TeaBags tempTeaBags;
while (listIterator.hasNext()) {
tempTeaBags = (TeaBags)listIterator.next();
totalTeaBags += tempTeaBags.countTeaBags();
}
return totalTeaBags;
}
public boolean add(TeaBags teaBagsToAdd) {
teaBagsToAdd.setParent(this);
return teaBagList.add(teaBagsToAdd);
}
public boolean remove(TeaBags teaBagsToRemove) {
ListIterator listIterator =
this.createListIterator();
TeaBags tempTeaBags;
while (listIterator.hasNext()) {
tempTeaBags = (TeaBags)listIterator.next();
if (tempTeaBags == teaBagsToRemove) {
listIterator.remove();
return true;
}
}
return false;
}
public ListIterator createListIterator() {
ListIterator listIterator = teaBagList.listIterator();
return listIterator;
}
}
注意,组合对象TinOfTeaBags实现了add, remove等对局部对象操作的方法,这些个动作也是联系局部和整体的关键。
最后写一个测试类,来使用我们预先布置好的局部类和整体类:
class TestTeaBagsComposite {
public static void main(String[] args) {
System.out.println("Creating tinOfTeaBags");
TeaBags tinOfTeaBags =
new TinOfTeaBags("tin of tea bags");
System.out.println("The tinOfTeaBags has " +
tinOfTeaBags.countTeaBags() +
" tea bags in it.");
System.out.println(" ");
System.out.println("Creating teaBag1");
TeaBags teaBag1 = new OneTeaBag("tea bag 1");
System.out.println("The teaBag1 has " +
teaBag1.countTeaBags() +
" tea bags in it.");
System.out.println(" ");
System.out.println("Creating teaBag2");
TeaBags teaBag2 = new OneTeaBag("tea bag 2");
System.out.println("The teaBag2 has " +
teaBag2.countTeaBags() +
" tea bags in it.");
System.out.println(" ");
System.out.println(
"Putting teaBag1 and teaBag2 in tinOfTeaBags");
if (tinOfTeaBags.add(teaBag1)) {
System.out.println(
"teaBag1 added successfully to tinOfTeaBags");
} else {
System.out.println(
"teaBag1 not added successfully tinOfTeaBags");
}
if (tinOfTeaBags.add(teaBag2)) {
System.out.println(
"teaBag2 added successfully to tinOfTeaBags");
} else {
System.out.println(
"teaBag2 not added successfully tinOfTeaBags");
}
System.out.println("The tinOfTeaBags now has " +
tinOfTeaBags.countTeaBags() +
" tea bags in it.");
System.out.println(" ");
System.out.println("Creating smallTinOfTeaBags");
TeaBags smallTinOfTeaBags =
new TinOfTeaBags("small tin of tea bags");
System.out.println("The smallTinOfTeaBags has " +
smallTinOfTeaBags.countTeaBags() +
" tea bags in it.");
System.out.println("Creating teaBag3");
TeaBags teaBag3 =
new OneTeaBag("tea bag 3");
System.out.println("The teaBag3 has " +
teaBag3.countTeaBags() +
" tea bags in it.");
System.out.println("Putting teaBag3 in smallTinOfTeaBags");
if (smallTinOfTeaBags.add(teaBag3)) {
System.out.println(
"teaBag3 added successfully to smallTinOfTeaBags");
} else {
System.out.println(
"teaBag3 not added successfully to smallTinOfTeaBags");
}
System.out.println("The smallTinOfTeaBags now has " +
smallTinOfTeaBags.countTeaBags() +
" tea bags in it.");
System.out.println(" ");
System.out.println(
"Putting smallTinOfTeaBags in tinOfTeaBags");
if (tinOfTeaBags.add(smallTinOfTeaBags)) {
System.out.println(
"smallTinOfTeaBags added successfully to tinOfTeaBags");
} else {
System.out.println(
"smallTinOfTeaBags not added successfully to tinOfTeaBags");
}
System.out.println("The tinOfTeaBags now has " +
tinOfTeaBags.countTeaBags() +
" tea bags in it.");
System.out.println(" ");
System.out.println("Removing teaBag2 from tinOfTeaBags");
if (tinOfTeaBags.remove(teaBag2)) {
System.out.println(
"teaBag2 successfully removed from tinOfTeaBags");
} else {
System.out.println(
"teaBag2 not successfully removed from tinOfTeaBags");
}
System.out.println("The tinOfTeaBags now has " +
tinOfTeaBags.countTeaBags() +
" tea bags in it.");
}
}
三、分析
通过以上实例,我们可以总结出以下几个关键的角色:
- Compoent 抽象类或接口,用来定义局部-整体的格局,定义公用基本属性,集合属性以及集合对象,定义抽象的add, remove等对局部对象的集合操作方法。
- Leaf 局部对象,或者说是叶子节点,如例子中的OneTeaBag对象。
- Composite 组合对象,实现add, remove等对局部对象的集合操作。
利用组合模式,可以简化客户代码,将组合对象和局部对象统一视为一种对象,忽略它们之间的不同。
如果从数据结构的角度考虑,我们可以把这种对象看成树状结构中的一个节点,它可以是一个叶子节点,也可以是一个分支节点,层层递归,互相变化,但是他们都是这个树的组成部分,可以共享树结点一些共有的属性。
分享到:
相关推荐
组合模式(Composite Pattern),又叫部分整体模式,是用于把一组相似的对象当作一个单一的对象。组合模式依据树形结构来组合对象,用来表示部分以及整体层次。这种类型的设计模式属于结构型模式,它创建了对象组的...
本文实例讲述了PHP设计模式:组合模式Composite。分享给大家供大家参考,具体如下: 1. 概述 在数据结构里面,树结构是很重要,我们可以把树的结构应用到设计模式里面。 例子1:就是多级树形菜单。 例子2:文件和...
将对象组合成树形结构以表示“部分-整体”的层次结构。它使得客户对单个对象和复合对象的使用具有一致性。
设计模式C++学习之组合模式(Composite)
15、组合模式COMPOSITE PATTERN 16、观察者模式OBSERVER PATTERN 17、责任链模式 18、访问者模式VISITOR PATTERN 19、状态模式 20、原型模式 21、中介者模式 22、解释器模式 23、亨元模式 24、备忘录模式
组合模式(Composite Pattern)是一种对象结构型模式,其定义是将多个对象组合成树形结构以表示“整体-部分”关系的层次结构。它使得客户端对单个对象和组合对象的使用具有一致性。在组合模式中,对象被组织成树形...
组合模式(Composite Pattern),又叫部分整体模式,是用于把一组相似的对象当作一个单一的对象。组合模式依据树形结构来组合对象,用来表示部分以及整体层次。这种类型的设计模式属于结构型模式,它创建了对象组的...
C++设计模式课件20_Composite_组合模式.pdf
主要为大家详细介绍了java设计模式之组合模式Composite,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
组合模式 Composite , 将对象组组合成树形结构以表示'部分-整体' 的层次结构.组合模式使得用户对单个对象的组合对象的使用具有一致性
主要为大家详细介绍了C++设计模式之组合模式Composite,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
组合模式(Composite),将对象组合成树形结构以表示‘部分-整体’的层次结构。组合模式使得用户对单个对象和组合对象的使用具有一致性。 组合模式的适用场合是,一般当你发现需求中是体现部分与整体层次的结构时,...
在这里与各位分享本人从网络上下载的C#面向对象设计模式纵横谈系列视频,共有25节,除了第一节需要各位贡献一点资源分以作为对本人上传资源的回馈,后面的其他资源均不需要... 这是第9节:结构型模式Composite组合模式
C#面向对象设计模式纵横谈(9):Composite 组合模式(结构型模式) 体验课程
c++设计模式-结构型模式-组合模式;qt工程;c++简单源码; 组合(Composite Pattern)模式的定义:有时又叫作整体-部分(Part-Whole)模式,它是一种将对象组合成树状的层次结构的模式,用来表示“整体-部分”的关系...
主要介绍了Java设计模式之组合模式(Composite模式)介绍,Composite定义:将对象以树形结构组织起来,以达成“部分-整体” 的层次结构,使得客户端对单个对象和组合对象的使用具有一致性,需要的朋友可以参考下
使用组合模式有如下的好处: l 定义了饱含基本对象和组合对象的类层次结构,基本对象可以被组合成更复杂的组合对象,而这个组合对象有可以被组合。 简化客户代码 客户可以一直地使用组合结构和单个对象,通常用户不...
Head First 设计模式 (九) 迭代器与组合模式(Iterator & Composite pattern) C++实现