gpt4 book ai didi

java - MVP 中的观察者模式

转载 作者:搜寻专家 更新时间:2023-11-01 08:35:48 24 4
gpt4 key购买 nike

我有一个系统(游戏),我尝试使用架构 Model-View-Presenter 来实现它。我现在所做的是演示者中的 while 循环,它不断调用用于显示的 View 方法。我这样做的方法是使用生产者/消费者模式,其中 View 为触摸事件 (Android) 注册和事件处理程序并生成相应的触摸实例,演示者在 while 循环中使用这些实例。

现在我想在模型和演示者之间使用观察者/订阅者模式。使用此 Presenter 将成为 Observer 订阅模型状态的更改。问题是,演示者将根据 View 中发生的事件在模型中执行更新。每次演示者在模型中执行一个方法时,它就会。可以更改其状态并通知演示者。然后我将在另一个线程中分离每个更新的模型,但是如果它在 while 循环内的不同线程中运行,我如何通知演示者?如果我调用notify observers的方法,presenter会在什么时候调用相应的方法?

这让我发疯! :P 我需要你们的帮助船长!

最佳答案

没关系。您有一个对象 Presenter,它在线程内的无限循环中使用。这并不意味着您不能在它被线程调用时调用它的方法。您唯一需要注意的是,如果线程正在读取/使用的数据与观察者通知更改的相同,您应该同步它的访问。

因此,总而言之,当 Presenter 在无限循环中运行时,对其方法的任何调用都将立即得到响应(除非它们具有同步访问,在这种情况下它将阻塞直到它得到锁所有权)

以下完全没问题:

class Presenter implements IObserver
{
public void aMethod() { }

public void notifyObserver() { }
}

class Model
{
private List<IObserver> observers = new ArrayList<>();

public void addObserver(IObserver obs) { observers.add(obs); }

public void notifyObservers()
{
for(IObserver o : observers) { o.notifyObserver(); }
}
}


final Presenter myPresenter = new Presenter();
Model myModel = new Model();
myModel.add(myPresenter);

new Thread(new Runnable()
{
@Override
public void run()
{
while(true)
{
myPresenter.aMethod();
}
}
).start();

关于java - MVP 中的观察者模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36788502/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com