让我们考虑一系列这样的对象:
Earth->Continent->Country->City->name
我们还要考虑Earth.class
有public static void main(String[] args)
使用命令行选项执行应用程序时,例如Barcelona
,在不引入中间参数的情况下,将其传递给City
对象的最佳方法是什么?
在程序执行期间的不同阶段创建对象。
我们应该使name
变量为静态还是使用IoC,例如Spring或Google Guice?
还有其他选择吗?
欢迎任何想法。
答案 0 :(得分:2)
earth.find(BarcelonaID).setName(args[0]);
PicoContainer中IoC解决方案的示例:
PicoContainer container = new DefaultPicoContainer();
container.addComponent(Earth.class);
container.addComponent(Continent.class);
container.addComponent(Country.class);
container.addComponent(City.class, new ConstantParameter(cityName));
City barcelona = container.getComponent(City.class);
答案 1 :(得分:2)
您可以从上到下构建数据结构 - Continent构建城市,或者自下而上 - main
构建城市并将其传递到国家/地区,或使用某种组合。 DI赞成后者。
public static void main(String... argv) {
// Bottom up.
City city = new City(/* args relevant to city */);
Country country = new Country(city, /* args relevant to country */);
Continent continent = new Continent(country, /* args relevant to continent */);
Planet planet = new Planet(continent, /* args relevant to planet */);
}
class City {
City(/* few parameters */) { /* little work */ }
}
class Country {
Country(/* few parameters */) { /* little work */ }
}
...
class Planet {
Planet(/* few parameters */) { /* little work */ }
}
可以比自上而下更清洁:
public static void main(String... argv) {
// Top down.
Planet earth = new Planet(
/* all the parameters needed by Earth and its dependencies. */);
}
class Planet {
Planet(/* many parameters */) { /* lots of work */ }
}
...
DI民众认为,自下而上的构造会产生更多可维护和可测试的代码,但您不需要DI框架来使用它。
答案 2 :(得分:1)
在我看来,这是您可以想象的Visitor模式的最佳用例。
基本上,应该有一个类Parameters
应该包含所有参数。可以使用Parameters
类访问需要一组参数的每个对象。然后,对象可以将参数传递给子节点,这些子节点知道要使用哪些参数以及如何使用。
在您的情况下,可以这样做:
public interface IParameterized{
public void processParameters(Parameters param);
}
public class Earth implements IParameterized{
public Earth(){
// Create all countries here and store them in a list or hashmap
}
public void processParameters(Parameters param){
// find the country you want and pass the parameters to it
country.processParameters(param);
}
}
public class Country implements IParameterized{
public Country(){
// Create all cities that belong to this country
}
public void processParameters(Parameters param){
// find the city you want and pass the parameters to it
city.processParameters(param);
}
}
public class City implements IParameterized{
public City(){
// Create city...
}
public void processParameters(Parameters param){
// Do something with the parameter
}
}
修改强> 要连接点,可以按以下方式使用:
public static void main(String... argv) {
Parameters params = new Parameters();
// Populate params from the command line parameters
Earth earth = new Earth();
// Earth takes the responsibilty of processing the parameters
// It will delegate the processing to the underlying objects in a chain
earth.processParameters(params);
}
作为旁注,您还可以查看Chain Of Responsibility设计模式