在大型且复杂的软件产品中,管理可配置设置成为一个主要难题。我见过的解决这个问题的两种方法是:
这些方法对我来说都是错误的。
是否有任何设计模式可以用来简化问题?也许可以利用依赖注入技术。
我更喜欢创建一个用于设置查询、加载和保存的界面。通过使用依赖注入,我可以将其注入到每个需要它的组件中。
这使得更换配置策略具有灵活性,并为所有工作提供了一个共同的基础。与单个全局“设置加载器”(您的选项 2)相比,我更喜欢它,特别是因为如果我绝对需要这样做,我可以覆盖单个组件的配置机制。
我目前正在开发一个系统,其中配置由一个全局单例对象管理,该对象保存配置键到值的映射。一般来说,我希望不要这样做,因为它可能会导致系统中的并发瓶颈,并且单元测试会很草率,等等。
我认为 Reed Copsey 有权利这么做(我投票给了他),但我绝对推荐阅读 Martin Fowler 关于依赖注入的精彩文章:
http://martinfowler.com/articles/injection.html
还有一个小小的附录...如果您想做任何模拟对象类型单元测试,依赖注入绝对是正确的选择。
这个怎么样。您可以使用单个方法 configure(configuration) 定义一个 Configurable 接口。配置参数只是一个哈希表,它将配置参数的名称与其值关联起来。
根对象可以以任何他们想要的方式创建配置哈希表(例如:从配置文件中读取它)。该哈希表可以包含根对象本身的配置参数,加上其组件、子组件、子子组件(等)之一可能使用的任何参数。
根对象然后在其所有可配置组件上调用configure(configuration)。
您可以创建定义配置加载器的接口的多个实现。基本上是策略模式,您可以将一个基本接口定义为 configLoader,然后进一步定义不同的实现,例如 FileSystemLoader、ClasspathLoader、EnvVariablesLoader 等。 详情请看这个链接
我通常有读取用户设置的控制器(本地存储在键值对中,通过
UserSettings
类访问)。
每个控制器负责读取静态定义的用户设置。然后,他们将所需的依赖项注入到视图(例如主题、语言包)或其他控制器(例如持久性机制、序列化、策略)中。
用户设置的存储方式取决于平台(例如,用于 Web 的本地存储、用于桌面的 XML 文件)。