0

你有接口。

public interface Group {
    public void assemble();
}

您有两个实现该接口的类。

public class Block implements Group {

    public void assemble() {
        System.out.println("Block");
    }
}

public class Structure implements Group {
  // Collection of child groups.
  private List<Group> groups = new ArrayList<Group>();

  public void assemble() {
    for (Group group : groups) {
      group.assemble();
    }
  }

  // Adds the group to the structure.
  public void add(Group group) {
    groups.add(group);
  }

  // Removes the group from the structure.
  public void remove(Group group) {
    groups.remove(group);
  }
}

创建对象后:

Structure structure = new Structure();
Structure structure1 = new Structure();

并在结构实例中填充 ArrayList:

structure1.add(new Block());
structure1.add(new Block());

你可以通过:structure.add(structure1)

但是,当您将一个 ArrayList 单独传递给另一个时,您必须使用 addAll 方法:

List<Group> groups = new ArrayList<Group>();
List<Group> groups1 = new ArrayList<Group>();
groups1.addAll(groups);

我的问题是为什么这有效?


示例来自:http: //javapapers.com/design-patterns/composite-design-pattern/

4

4 回答 4

1

没有通过,ArrayList你正在通过StructureStructureArrayList,它是 的后代Group。这个结构有它自己的list内部。使用它自己的assemble()方法实现。

于 2013-09-12T11:35:26.433 回答
0

因为您将 groups1 实例化为 ArrayList。当您创建结构时,这不是 ArrayList。

我认为您“可能”表明的是您想要这样做:

   public List<Group> groups = new ArrayList<Group>();

将上面的访问修饰符更改为 public。

然后,您将能够执行以下操作:

    structure.groups.addAll...
于 2013-09-12T11:42:11.807 回答
0

因为您使用 addAll 方法。您将一个列表添加到另一个列表。你为什么混淆?

    /**
 * Appends all of the elements in the specified collection to the end of
 * this list, in the order that they are returned by the
 * specified collection's Iterator.  The behavior of this operation is
 * undefined if the specified collection is modified while the operation
 * is in progress.  (This implies that the behavior of this call is
 * undefined if the specified collection is this list, and this
 * list is nonempty.)
 *
 * @param c collection containing elements to be added to this list
 * @return <tt>true</tt> if this list changed as a result of the call
 * @throws NullPointerException if the specified collection is null
 */
public boolean addAll(Collection<? extends E> c) {
Object[] a = c.toArray();
    int numNew = a.length;
ensureCapacity(size + numNew);  // Increments modCount
    System.arraycopy(a, 0, elementData, size, numNew);
    size += numNew;
return numNew != 0;
}
于 2013-09-12T11:31:43.007 回答
0

这两个例子做了非常不同的事情。当你这样做

structure.add(structure1);

您在此处添加了两个层次结构级别,因为如果 您将其视为一棵树,那么您在其自身Group下方的第一级添加了结构 1。属于structure的s在这里处于第二级,仍然附加到structure1Blockstructure1

但是当你这样做时

groups1.addAll(groups);

你在这里只得到一个单级层次结构,因为你没有添加一个Groupbut,它的所有成员,而是直接在下面groups1作为任何Block可能是它的孩子的 s 的兄弟姐妹。

于 2013-09-12T11:39:40.730 回答