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