哪些设计模式可以应用于配置设置问题?

90

在大型和复杂的软件产品中,管理可配置设置成为一个主要问题。我见过解决该问题的两种方法:

  • 让系统中的每个组件从配置文件或注册表设置中加载自己的配置。
  • 有一个设置加载器类来加载所有可配置的系统设置,并让每个组件查询设置加载器以获取其设置。

这些方法都让我感觉不对劲。

是否有任何设计模式可用于简化该问题? 或许可以利用依赖注入技术的某些东西。


4
你为什么认为选项2是错误的? - ChaosPandion
2
通常情况下,它被实现为单例模式,尽管还有其他实现方式。 - Daniel Bingham
4个回答

51

我倾向于创建一个界面来设置查询、加载和保存。通过使用依赖注入,我可以将其注入到每个需要它的组件中。

这样做可以在替换配置策略方面提供灵活性,并为一切工作提供一个共同的基础。我更喜欢这种方法而不是使用单个全局“设置加载器”(选项2),尤其是因为如果必须这样做,我可以覆盖单个组件的配置机制。


15
你好,如果你能分享一些样本,那将是很好的。 - issamux
@issamux,有人根据这个答案这里提供了一个代码示例。 - dian jin

22
我目前在处理一个系统,该系统的配置由一个全局单例对象管理,该对象将配置键和值映射到一起。总的来说,我希望不要以这种方式进行配置管理,因为它可能会导致系统并发性能瓶颈,而且也不利于单元测试等等。
我认为Reed Copsey是正确的(我投了他一票),但我强烈建议阅读Martin Fowler关于依赖注入的优秀文章: http://martinfowler.com/articles/injection.html 还有一点需要补充...如果你想进行任何模拟对象类型的单元测试,那么依赖注入绝对是最好的选择。

看起来装饰器符合您的需求。您可以创建一个可序列化的装饰器,以便能够使类以自己的方式进行序列化。策略可以用于使所有对象都具有其自己的序列化策略。那些不需要被序列化的对象可以使用忽略策略。只需要序列化它们的字段的对象可以使用OnlyFields策略等等。您将可以灵活地向配置中添加新内容。当然,像所有方法一样,这种方法也有其优缺点。 - Yaroslav Yakovlev

5
如下:

这样如何。您可以定义一个名为 Configurable 的接口,其中包含一个 configure(configuration) 方法。configuration 参数只是一个哈希表,它将配置参数的名称与其值相关联。

根对象可以以任何他们想要的方式创建配置哈希表(例如:从配置文件中读取)。该哈希表可能包含根对象自身的配置参数,以及其组件、子组件、子子组件(等等)中可能使用的任何参数。

然后,根对象对其所有可配置组件调用 configure(configuration) 方法。


0

你可以创建多个实现配置加载器接口的实现。基本上是“策略模式”,你可以定义一个基本的configLoader接口,然后进一步定义不同的实现,例如FileSystemLoader、ClasspathLoader、EnvVariablesLoader等。 有关详细信息,请参阅链接


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接