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


82

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

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

这些方法对我来说都是错误的。

有没有可以用来简化问题的设计模式?也许可以利用依赖注入技术。


4
为什么您认为选项2错误?
2009年

2
尽管有其他实现方法,但通常将其实现为单例。
丹尼尔·宾汉

Answers:


47

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

这样就可以灵活地替换配置策略,并为所有工作提供了通用基础。与单一的全局“设置加载器”(您的选项2)相比,我更喜欢这样做,尤其是因为如果我绝对需要的话,我可以覆盖单个组件的配置机制。


7
您好,如果您分享一些示例,那就太好了:)
issamux

20

我目前在一个由一个全局单例对象管理配置的系统上,该对象保持配置键到值的映射。总的来说,我希望没有这样做,因为它可能会导致系统中的并发瓶颈,并且对于单元测试来说太草率。

我认为Reed Copsey有权(我对他投了赞成票),但是我绝对会建议阅读Martin Fowler关于依赖注入的出色文章:

http://martinfowler.com/articles/injection.html

也有一点补充...如果您想进行任何模拟对象类型的单元测试,则依赖注入绝对是必经之路。


装饰器似乎符合您的需求。您可以创建一个可序列化的装饰器,该装饰器将使类以自己的方式可序列化。策略可用于使所有对象都有其序列化策略。那些不需要序列化的对象可以使用忽略策略。那些只需要序列化其字段OnlyFields策略的对象,依此类推。您ll be flexible with adding new things to your config. Sure as all approaches this have it的利与弊。
Yaroslav Yakovlev

4

这个怎么样。使用单个方法configure(configuration)定义可配置的接口。配置参数只是一个哈希表,它将配置参数的名称与其值相关联。

根对象可以按其希望的任何方式创建配置哈希表(例如:从配置文件读取)。该哈希表可能包含根对象iselft的配置参数,以及其组件,子组件,子子组件(等)之一可能使用的任何参数。

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


0

您可以创建定义配置加载程序的接口的多个实现。基本上是策略模式,您可以在其中定义一个基本接口作为configLoader,然后再定义其他不同的实现,例如FileSystemLoader,ClasspathLoader,EnvVariablesLoader等。此链接的详细信息

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.