实现封装的正确方法

时间:2016-04-25 02:34:16

标签: java java-8

我有以下课程方案。

enter image description here

National ArrayList ZoneZone ArrayList RegionRegion ArrayList } Person

所以我有下一个问题:

1)我可以“推”一个人通过国家和地区将其添加到地区吗?

例如:

National national = new National();
....
national.addPerson(person); // Every level has his own addPerson method

national.getZone(i).getRegion(i).addPerson(person);

在OOP中执行此操作的正确方法是什么?

2)可以制作一个方法,让我返回一个级别的每个人吗?

我的意思是例如:

Zone zone = new Zone();
...
zone.getPersons(); //Return a ArrayList with the persons of every Region in Zone.

这与封装有关吗?

3)每个级别的next(),hasNext(),first()方法,因此我可以在该特定级别进行迭代。

这就是全部。我总体上得到了封装和OOP,但我无法弄清楚什么是正确的,哪些是错的。

感谢。

1 个答案:

答案 0 :(得分:1)

根据您的类图,Person必须始终是Region的成员,即NationalZone不能直接包含Person

在这种情况下,匹配签名Region的方法只能在addPerson(Person p)中出现。如你所说,那你就得做

Region

没有合理的理由可以说,

national.getZone(i).getRegion(j).addPerson(person);

因为National#addPerson(Person p) 没有关于此人所属的NationalZone的信息。

但是,您可以向RegionNational添加便捷方法,如您所说,“推”一个人,但只有在您提供必要的数据时才会这样做。

Zone

National#addPerson(ZoneId zid, RegionId rid, person) { ... ZoneId替换您用于查找RegionId内的区域和区域的任何密钥类型。

National

如上所述Zone#AddPerson(RegionId rid, person) { ...

这只是一个开始,您必须考虑诸如在RegionId电话中找不到ZoneId和/或RegionId时会发生什么等问题。在此设计中,唯一可行的选择是抛出异常,因为此时您没有足够的信息来实例化addPerson(...)Zone

编辑:

如果您在评论中指出,Region对象包含足以识别PersonZone的信息,那么Region和{{1}中的便捷方法可以执行所需的查找并委托给链中的下一个National