如何用复合模式做一个类?

时间:2012-11-24 12:10:04

标签: java design-patterns composite

我有一个实现SquareIcon接口的Java类(Icon)。它绘制一个正方形,您可以在创建一个正方形时选择尺寸和颜色。我现在想要使用复合模式CompositeIcon)编写一个类,这样就可以绘制几个不同的方块。我已经阅读了关于复合模式的内容,但我似乎无法使它工作。

SquareIcon课程中,我有以下三种方法:

  • getIconHeight
  • getIconWidht
  • paintIcon

我必须将所有这些都放在CompositeIcon课程中,对吗?但是我该怎么做?我一直在考虑这些问题,但我不知道这是否正确:

public int getIconWidth() {
  for (Icon i : icons) {
    i.getIconWidth();
  }
}

我也不知道如何为paintIcon方法执行此操作,因为它需要4个参数,这意味着这不起作用。

1 个答案:

答案 0 :(得分:4)

复合模式将叶子类和父类视为相同。

您必须从一个通用界面开始:

public interface Icon {
    void paint();
}

Leaf实现了界面:

public class LeafIcon implements Icon {
    public void paint() { 
        // more here
    }
}

Parent也是如此,它有一个Leaf子集合:

public class ParentIcon implements Icon {
    private List<Icon> children = new ArrayList<Icon>();
    public void paint() {
        for (Icon child : children) {
            child.paint();
        }
    }
}

您的代码应该处理图标集合。你可以在叶子和父母身上使用所有paint()方法。

List<Icon> icons = new ArrayList<Icon>();
for (Icon icon : icons) {
    icon.paint();
}

集合中的任何父级都将以递归方式将其子节点一直调用到树中的叶节点。