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