如何重用具有一些更改的对象层次结构

时间:2018-01-30 12:57:06

标签: oop

我一直在使用对象层次结构作为我使用Java开发的其他API之一的输入。像这样,一条街道包括一些房屋;每个房子都有一些房间:

{"streetName":"street1","houses":[{"number":22,"rooms":[{"roomId":1,"roomWidth":6}]}]}

在另一个休息中,我需要与大多数字段完全相同的层次结构,但我需要更多的字段用于房间实体(层次结构树中的最后一个对象)。我不喜欢只在原始Room类中添加额外的字段,因为它们不会在第一个Rest API中使用。只是为新的Rest API复制/粘贴新类中的整个层次结构类是另一个坏主意。目前我已经做到了这一点:

public class StreetForRest2 extends StreetForRest1 {
@Override
public void setHouseForRest1(HouseForRest1 houseForRest1){
     //cast and set HouseForRest2  }
//the same for getter
}

public class HouseForRest2 extends HouseForRest1 {//same as above}

public class RoomForRest2 extends RoomForRest1 {
//extra fields with setters and getters
}

但仍不满意。还有更好的主意吗?

1 个答案:

答案 0 :(得分:0)

我认为您使用Jackson的ObjectMapper或Gson或类似的东西以json格式序列化您的POJO。我建议使用一个Json对象(它就像一个HashMap,所有这些库都有一个,比如Jackson的JsonNode)而不是POJO用于​​这种情况,这样你就可以以更灵活的方式处理它们。这样,您可以使用decorator pattern以OOP样式添加额外功能,而无需修改原始对象。

例如,让我们假设并且您想要为标记为数据库中的特征的房屋添加一些额外的属性。你可以这样做:

public interface Jsonable {
    JsonNode asJson();
}

public class SimpleStreetJson implements Jsonable {
    private final ObjectMapper objectMapper;
    private final HouseForRest1 pojo;

    public SimpleStreetJson(ObjectMapper objectMapper, HouseForRest1 pojo) {
        this.objectMapper = objectMapper;
        this.pojo = pojo;
    }

    public JsonNode asJson() {
        return objectMapper.convertValue(pojo, JsonNode.class);
    }
}

public class JsonWithFeatureHouses implements Jsonable {
    private final Jsonable jsonable;
    private final Collection<String> featuredHousesIds;

    public JsonWithFeatureHouses(Jsonable jsonable, Collection<String> featuredHousesIds) {
        this.jsonable = jsonable;
        this.featuredHousesIds = featuredHousesIds;
    }

    public JsonNode asJson() {
        JsonNode json = jsonable.asJson();
        for(house : jsonable.asJson().get("houses")) {
            if(featuredHousesIds.contains(house.get("id"))) {
                house.put("featured", true);
                house.put("featured_house_url", "url here ...")
            }
        }
        return json;
    }
}

最后,您可以构建像这样的对象:

Json json = new JsonWithFeatureHouses(new SimpleStreetJson(objectMapper, pojo)).asJson();