一、概述
将对象组合成树型结构以表示“部分--整体”的层次关系。组合模式使得用户对单个对象和组合对象的使用具有一致性。
二、适用性
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
穆先生指导魔铃、星矢、一辉、紫龙修圣衣!