设计模式(8)-结构型-组合模式(Composite)
组合模式是结构型设计模式中使用频率非常高的模式之一。 通常它将一个对象包装成树型结构,以表示“整体”与“部分”的层次结构,从用户的角度来看,单个对象与组合对象,看起来,具有一致的接口。
适用性描述:
- 你想描述的对象,具有部分-整体的层次结构
- 用户希望能忽略组合对象与单个对象的不同,用户将统一的使用的使用组合结构中的所有对象
参与者描述:
1.Component 为组合中的对象声明接口。 在适当的情况下,实现所有类共有接口的缺省行为。 声明一个接口用于访问和管理Component的子组件。 (可选)在递归结构中定义一个接口,用于访问一个父部件,并在合适的情况下实现它。 2.Leaf 在组合中表示叶节点对象,叶节点没有子节点。 在组合中定义节点对象的行为。 3.Composite 定义有子部件的那些部件的行为。 存储子部件。 在Component接口中实现与子部件有关的操作。 4.Client 通过Component接口操纵组合部件的对象。
示例:
package com.sql9.structured;
import java.util.ArrayList;
import java.util.List;
//字符片段
abstract class Piece {
// 统计字数
public abstract int count();
public abstract void add(Piece p);
public abstract void remove(Piece p);
protected List<Piece> pieces;
public List<Piece> getPieces() {
return pieces;
}
}
class Sentence extends Piece {
String word;
public Sentence(String word) {
this.word = word;
pieces = null;
}
public int count() {
return word == null ? 0 : word.length();
}
public void add(Piece p) {
}
public void remove(Piece p) {
}
}
class Paragraph extends Piece {
public Paragraph() {
pieces = new ArrayList<Piece>();
}
public int count() {
int count = 0;
for (Piece p: pieces) {
count += p.count();
}
return count;
}
public void add(Piece p) {
pieces.add(p);
}
public void remove(Piece p) {
pieces.remove(p);
}
}
public class CompositeTest {
public static void main(String[] args) {
Piece child = new Sentence("abcde");
Piece child2 = new Sentence("123");
Piece child3 = new Sentence("456789");
Piece para = new Paragraph();
Piece para2 = new Paragraph();
para.add(child);
para.add(child2);
para2.add(child3);
para2.add(para);
int count = para2.count();
System.out.println("count of para2 = " + count);
}
}
结果:
count of para2 = 14
<script type="text/javascript"><!-- google_ad_client = "ca-pub-7104628658411459"; /* wide1 */ google_ad_slot = "8564482570"; google_ad_width = 728; google_ad_height = 90; //--></script><script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"></script>