一、概述
将对象组合成树型结构以表示“部分--整体”的层次关系。组合模式使得用户对单个对象和组合对象的使用具有一致性。
二、适用性
1.你想表示对象的部分--整体层次结构的时候。
2.你希望用户忽略组合对象与单个对象的不同的时候,用户将统一地使用组合结构中的所有对象。
三、参与者
1.Component:为组合中的对象声明接口。在适当的情况下,实现所有类共有接口的缺省行为。声明一个接口用于访问和管理Component的子组件。在递归结构中定义一个接口,用于访问一个父部件,并且在适当的情况下实现它。
2.Leaf:在组合中表示叶节点对象,叶节点没有子节点。在组合中定义节点对象的行为。
3.Composite:定义有子部件的那些部件的行为。存储子部件。在Component接口中实现与子部件有关的操作。
4.Client:通过Component接口操作组合部件的对象。
四、类图
五、示例
Component
package cn.lynn.composite;
import java.util.List;
public abstract class Saint {
private String name;
protected List<Saint> saints;
public List<Saint> getSaints() {
return saints;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public void printInfo() {
System.out.println(name);
}
protected abstract void obtain(Saint saint);
protected abstract void deprive(Saint saint);
}
Leaf
package cn.lynn.composite;
public class BronzeSaint extends Saint {
public BronzeSaint(String name) {
super.setName(name);
super.saints = null; // 青铜圣斗士已经是最低级的
}
@Override
public void obtain(Saint saint) {
}
@Override
public void deprive(Saint saint) {
}
}
package cn.lynn.composite;
public class SilverSaint extends Saint {
public SilverSaint(String name) {
super.setName(name);
super.saints = null; // 白银圣斗士比青铜圣斗士强点
}
@Override
public void obtain(Saint saint) {
}
@Override
public void deprive(Saint saint) {
}
}
Composite
package cn.lynn.composite;
import java.util.ArrayList;
public class GoldSaint extends Saint {
public GoldSaint(String name) {
super.setName(name);
super.saints = new ArrayList<Saint>(); // 还是黄金圣斗士牛逼,竟然会修圣衣
}
@Override
public void obtain(Saint saint) {
super.saints.add(saint);
}
@Override
public void deprive(Saint saint) {
super.saints.remove(saint);
}
}
Client
package cn.lynn.composite;
import java.util.List;
public class Client {
public static void main(String[] args) {
Saint goldSaint = new GoldSaint("穆先生");
Saint silverSaint = new SilverSaint("魔铃");
Saint bronzeSaint1 = new BronzeSaint("星矢");
Saint bronzeSaint2 = new BronzeSaint("一辉");
Saint bronzeSaint3 = new BronzeSaint("紫龙");
goldSaint.obtain(silverSaint);
goldSaint.obtain(bronzeSaint1);
goldSaint.obtain(bronzeSaint2);
goldSaint.obtain(bronzeSaint3);
StringBuffer sb = new StringBuffer();
sb.append(goldSaint.getName()+"指导");
List<Saint> saints = goldSaint.getSaints();
for (Saint saint : saints) {
sb.append(saint.getName());
sb.append("、");
}
sb = sb.deleteCharAt(sb.length() - 1);
sb.append("修圣衣!");
System.out.println(sb.toString());
}
}
Result
穆先生指导魔铃、星矢、一辉、紫龙修圣衣!