繁体   English   中英

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

[英]Design patterns: many objects of same type with multiple objects of other type

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

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

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

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")但这里似乎都不是解决方案。 所以,我回到了我最初的问题。 这样做的好方法是什么?

城市列表很大,很可能您需要的不仅仅是一个国家或城市的名称。 将此信息存储在文件中以供常规使用是不切实际的,并且绝对不是枚举。 相反,您可以使用数据库,您可以使用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);
}

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM