我有三个类以有趣的方式进行交互。一个是模型类,它必须由其他两个类访问,因此它的单个实例作为每个类的成员保存。这两个类都以不同的方式与模型交互。
有几个实例必须完全抛弃模型对象并用新实例替换,这使事情复杂化。并且这些场合出现在两个观看/控制类中。因此,这些类中的任何一个必须能够向另一个发送信号,说“我们需要协调并促进用新的Model对象替换我们的Model对象”。现在我在B类中有代码告诉A类构造一个新模型并将其发送回来,但现在我需要处理相反的情况,其中事件在A类中出现,不幸的是A类没有引用B级,可能不应该。
处理此问题的好方法是什么?
更新:对不起,伙计们,这不可能是单身人士。单身人士是你需要保证只有一件东西的时候。这与我上面提到的任何要求无关。这个类不是单身,不应该是。
更新:到目前为止,实际上只有这个Model类的一个实例,但我有一个模糊的怀疑,我需要允许更多,我不想限制自己通过使用Singleton设计模式,实际上解决了我所拥有的不同问题。事实证明我是对的:昨天我收到了新的要求,现在我需要支持任意数量的这些。 :)当你不需要的时候,不要限制自己,不要在没有意图的情况下滥用设计模式!
答案 0 :(得分:5)
你需要一个中间模型层,这两个类中的每一个都引用一个模型“holder”对象。 ModelHolder保存对模型的引用。
此ModelHolder还应支持侦听器,因此当抛出其模型时,它可以通知任何侦听器模型已更改。
答案 1 :(得分:1)
好的,如果您需要更改模型(但不是强制),您可以创建一个侦听器接口,并使对象A和B实现它:
public interface ModelListener {
public void modelChanged(Model newModel);
}
在适当的时候,您可以通知听众新的模型更改。您还可以拥有一个包含所有已注册侦听器的列表。
List<ModelListener> modelListeners = new ArrayList<ModelListener>();
public void setNewModel(Model m) {
for (ModelListener aListener : m.modelListeners)
aListener.modelChanged(m);
}
与往常一样,在简单性和健壮性之间存在权衡。您可能希望尝试自己案例所需的级别。
答案 2 :(得分:0)
我经常在GUI项目(Swing,GWT)中遇到这个设计问题。我通常做的是创建一个更高级别的“状态”模型,该模型包含在2个或更多类之间共享的对象的实例。然后,State具有ModelListener接口,其他类可以实现该接口以获取对基础模型的更改的通知。 State.setFoo()然后向侦听器触发ModelChanged事件,侦听器会相应地做出响应。