设计模式:许多相同类型的对象具有多个其他类型的对象

时间:2017-06-25 13:33:59

标签: java design-patterns

如果我要申请我必须存储欧洲所有国家以及他们各自的城市(例如),这将是一个很好的方法吗?

我考虑使用枚举来存储信息,但由于这需要我对大量数据进行硬编码,因此我很快就废弃了这个想法。

之后我考虑过这样的事情:

class Country {

    public Country(String name, City... cities) {
        //Stuff
    }
}

通过这种方式,我可以从.txt中读取城市并相应地创建对象,从而无需手工劳动。但是,这带来了一个新问题,我在哪里存储我的国家列表?我考虑过以下几点:

class Country {

    public Country(String name, City... cities) {
        //Stuff
    }

    public static List<Country> getAllCountries() {
        return countries;
    }
}

但我觉得这样的代码污染了项目的结构和清洁度。

我考虑过使用枚举(乡村)和班级(城市)的组合,但这也感觉不对。

理想情况下,我希望能够像枚举Country.FRANCECountry.getByName("France")那样访问国家/地区,但这似乎都不是解决方案。所以,我回到我最初的问题。这样做的好方法是什么?

2 个答案:

答案 0 :(得分:0)

城市列表很大,您可能需要的不仅仅是一个国家或城市的名称。将此信息存储在文件中以供常规使用是不切实际的,并且绝对不是枚举。相反,您可以使用数据库,您可以使用Geonames数据填充该数据库。 Geonames数据库包含有关城市位置的信息以及更多其他信息。您可以使用ISO 3166-1 alpha-2代码来标识国家/地区和Geoname ID以引用该国家/地区的城市。如果您想要以不同语言显示国家/地区列表,还有国家/地区的本地化名称。

此数据可从此处下载(说明如下): http://download.geonames.org/export/dump/

您可以轻松找到用于将文件导入Github中所选数据库的代码 - 有很多例子可以做到这一点。

使用数据库,您的代码可能如下所示:

class CountryRepository {
    public Country findByISOCode(String code) { ... }
    public List<Country> findAll() { 
       // JDBC or JPA query
    }
}

class SomeBusinessLogic {
    private CountryRepository countries;
    private CityRepository cities;
    ...
    Country france = countries.findByISOCode("FR");
    List<City> largestFrenchCities = cities.findTopLargestIn(france, 5);
}

答案 1 :(得分:0)

您可以使用HashMap。这是密钥和值对的存储。 它看起来像这样:

HashMap<Country, City> europe = new HashMap<Country, City>();