Design patterns 程序设置设计模式
我想让我的程序的更改设置立即生效,而不是重新启动我的程序,什么样的设计模式适合这里Design patterns 程序设置设计模式,design-patterns,settings,Design Patterns,Settings,我想让我的程序的更改设置立即生效,而不是重新启动我的程序,什么样的设计模式适合这里 有一个中心设置类,一旦设置更改,它必须更新需要更新的对象的属性,如果对象的数量很大,这将在对象和设置之间创建不必要的依赖关系 观察者模式如何,但这种模式似乎也不适合这里。然后我必须向对象添加事件处理程序,但这似乎不是对象的责任 你的解决方案是什么 这不是个好主意。您不希望设置对象了解所有这些对象。另一种方法显然更好 ->为什么这种模式不适合这里 这不是个好主意。您不希望设置对象了解所有这些对象。另一种方法显然更好
观察者模式听起来像你想要的
在“SettingListener”的上下文中考虑一下,观察者模式听起来像是您想要的
在“SettingListener”的上下文中考虑一下,我们曾经对我们的一个项目提出过类似的请求 我们使用了一个包含设置的单例类。所有对象都知道这个对象,并在需要时从那里汇集它们的设置 此单例具有isValid属性。您通过Singleton的getInstance方法获得了配置。当isValid为false时,getInstance只是在返回配置之前将其重新加载到实例中
基本上,您更改了Singleton正在使用的设置文件,然后使Singleton无效,以宣布它重新加载其设置 我们曾经有一个类似的项目要求 我们使用了一个包含设置的单例类。所有对象都知道这个对象,并在需要时从那里汇集它们的设置 此单例具有isValid属性。您通过Singleton的getInstance方法获得了配置。当isValid为false时,getInstance只是在返回配置之前将其重新加载到实例中
基本上,您更改了Singleton正在使用的设置文件,然后使Singleton无效,以宣布它重新加载其设置 根据正在更改的内容,有几种方法可以处理不重新启动应用程序的问题 如果您的所有设置都在一个单例中,那么您可以告诉它从配置文件重新加载,因为静态值在其中,所以应用程序立即开始使用新值
如果要更改更关键的内容,可能必须确保应用程序的设计方式使控制器能够进入并进行必要的更改,但这可能最好需要重新启动,即使用户没有这样做,但是您只需要告诉应用程序重新初始化自己。根据所做的更改,有几种方法可以处理不重新启动应用程序的问题 如果您的所有设置都在一个单例中,那么您可以告诉它从配置文件重新加载,因为静态值在其中,所以应用程序立即开始使用新值 如果要更改更关键的内容,可能必须确保应用程序的设计方式使控制器能够进入并进行必要的更改,但这可能最好需要重新启动,即使用户没有这样做,但是您只需要告诉应用程序重新初始化自己。第2部分的一个变体:定义一种将某些功能标记为设置的方法。比如说,
class Screen {
...
[Setting("screen.blink")]
public boolean Blink { ... set { ... } }
}
这里的想法是,当用户切换screen.blink
设置时,设置代码将自动执行,例如,screen.Instance.blink=true
(或false)。这与观察者模式是一样的,但对我来说,它似乎更松散地耦合在一起
另一方面,设置代码必须知道如何找到正确的对象。在上面的玩具示例中,我假设您可以执行Screen.Instance
。这太简单了。这完全取决于你的项目。您需要制定一个惯例来查找适合您的可配置对象。第2部分的变体:定义一种将某些功能标记为设置的方法。比如说,
class Screen {
...
[Setting("screen.blink")]
public boolean Blink { ... set { ... } }
}
这里的想法是,当用户切换screen.blink
设置时,设置代码将自动执行,例如,screen.Instance.blink=true
(或false)。这与观察者模式是一样的,但对我来说,它似乎更松散地耦合在一起
另一方面,设置代码必须知道如何找到正确的对象。在上面的玩具示例中,我假设您可以执行
Screen.Instance
。这太简单了。这完全取决于你的项目。您需要制定一个惯例来查找适合您的可配置对象。我部分同意dpb。使用单例是集中访问“缓存”设置的好方法。然而,这是被动访问。更改设置时,不会通知使用Singleton SettingClass的类更改
要获得通知机制,需要引入某种发布者-订阅者模式
我理解您在观察者中引入事件处理程序时遇到问题,因为您认为这不是观察者的责任。我同意这一点
例如,如果您有一个被动的业务实体,您就不想用事件处理程序或属性污染它。也许您可以使用观察者和访问者模式的组合,这样您就不需要对类执行侵入性操作来进行通知。我部分同意dpb。使用单例i