可以使用java中的列表实现复合模式吗?

时间:2016-10-20 11:20:52

标签: java design-patterns

我希望实现一个复合模式,其中将对象emp添加到tl然后将tl添加到pm。我的列表应该只包含pm对象,其中的其余对象按顺序存储。

但是当我迭代并尝试打印时,它只显示pm的值而不显示其他两个对象值。

在这里,在一个pm对象下我需要两个tl对象,在一个tl下我需要三个emp对象。

List<Entity> ls = new ArrayList<Entity>();
    Entity pm = new Entity();
    Entity tl = new Entity();
    Entity emp = new Entity();
    int i = 0, j = 0, k = 0;
    for (i = 1; i <= 3; i++) {
        emp = new Entity("Associate"  + i, "Salem", 7563214, 3);
        // ls.add(obj);
        for (j = 1; j <= 2; j++) {
            tl = new Entity("TL" + j, "Chennai", 4756921, 2);
            tl.adds(emp);
            // ls.add(obj);

            for (k = 1; k <= 3; k++) {
                pm = new Entity("PM"+ k, "Erode",  5693214, 1);
                pm.adds(tl);
                ls.add(pm);                 
            }
        }
    }

这里每个构造函数中的最后一个值定义级别。我的JSP中有一个按钮,点击了该级别。

<div id="company" style="display:none">
PM < TL
EMP

此列表ls被传递给同一个类中的另一个方法,其中另一个列表用于根据级别从列表中检索值。

List<Entity> subset = new ArrayList<Entity>();
    for (Entity val : a) {


            if (val.getLevel()>=level) {
                subset.add(val);
            }

我的bean类是

公共类实体{

private String name;
private String dept;
private int phNum;
private int level;
private List<Entity> entityList;

public Entity(){}

public Entity(String name,String dept, int phNum,int level) {
    this.name = name;
    this.dept = dept;
    this.phNum = phNum;
    this.level = level;
    entityList = new ArrayList<Entity>();
}
public void adds(Entity e) {
    entityList.add(e);
 }

 public List<Entity> getEntityList(){
   return entityList;
 }

1 个答案:

答案 0 :(得分:1)

实现所需内容的优雅方法是实现toString()方法,如下所示。您可能也想对其他字段使用append(),而不是使用+连接字符串。 在这里,我只是为了懒惰而复制了你的代码。 你可以拥有&lt; BR&gt;或者其他格式化标签添加到StringBuilder中,以便很好地格式化打印数据。

public String toString(){
      StringBuilder stringRep = new StringBuilder().append(" Name : " + name + ", dept : " + dept + ", ph num :" + phNum+" ");
      for(Entity subEntity:entityList){
          stringRep.append(subEntity.toString());
      }
      return stringRep.toString();  
}