当前位置: 首页 > 知识库问答 >
问题:

MVP中的观察者模式

景嘉志
2023-03-14

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

现在我想在模型和演示者之间使用模式观察者/Suscriber。使用这个模式,演示者将是观察者订阅模型状态的变化。问题是,演示者将执行模型中的更新,相应于视图中发生的事件。每次演示者执行一个方法in.the模型,就有可能改变它的状态并通知演示者。我将在另一个线程中为每次更新分离模型,但是如果它在while循环中的不同线程中运行,我如何通知演示者?如果我调用方法通知观察者,演示者什么时候会调用相应的方法?

我快疯了!我需要你们的帮助,队长们!

共有2个答案

陆飞鸿
2023-03-14

就架构而言,你可能过度设计了这个。MVP、生产者/消费者和观察者都在同一个帖子里。警钟正在敲响。我怀疑你不需要生产者/消费者或观察者模式,MVP可能完全足够了。

试试这个。

创建3个文件:

  • GameFragment.java
  • GameView.java
  • GamePresenter.java
public class GamePresenter {
    private final GameView view;

    public GamePresenter(GameView view){
        this.view = view;
        NetworkController.addObserver(this);//listen for events coming from the other player for example. 
    }

    public void onSwipeRight(){
        // blah blah do some logic etc etc
        view.moveRight(100);
        NetworkController.userMovedRight();
    }

    public void onNetworkEvent(UserLeftGameEvent event){
        // blah blah do some logic etc etc
        view.stopGame()
    }
}

是一个接口

public interface GameView {
    void stopGame();
    void moveRight(int pixels);
}

游戏片段是一个扩展片段并实现游戏视图的类,并且有一个游戏演示者作为成员。

public class GameFragment extends Fragment implements GameView {
    private GamePresenter presenter;

    @Override
    public void onCreate(Bundle savedInstanceState){
        presenter = new GamePresenter(this);
    }
}

这种方法的关键是清楚地了解每个文件的作用。

片段控制任何与视图相关的内容(按钮,文本视图等)。它通知演示者用户交互。

呈现者是引擎,它从视图中获取信息(在这种情况下,它是片段,但是请注意,这种模式非常适合依赖注入?这不是巧合。演示者不知道视图是一个片段——它不关心),并将其与从“下面”接收的信息(通信、数据库等)相结合,然后相应地命令视图。

视图只是演示者与视图通信的接口。请注意,这些方法读取为命令,而不是问题(例如getViewState()),也不是通知(例如onPlayerPositionUpdated())-命令(例如movePlayerHere(int posithtml" target="_blank">ion))。

越学文
2023-03-14

没关系。你有一个对象,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();
 类似资料:
  • 是否有一种设计模式可以形成一个“复合”观察者/可观察者? 我的意思是我有一个可观察的,它在某个变化时通知它的监听器。 每个监听器也是一个可观察的,并通知它自己的监听器(在某个动作上,它做了哪个动作是由第一个可观察的通知触发的)。 这种观察者/可观察的“链接”作为设计是可以的,还是有一个标准的模式?

  • 主要内容:介绍,实现,Subject.java,Observer.java,BinaryObserver.java,OctalObserver.java,HexaObserver.java,ObserverPatternDemo.java当对象间存在一对多关系时,则使用观察者模式(Observer Pattern)。比如,当一个对象被修改时,则会自动通知依赖它的对象。观察者模式属于行为型模式。 介绍 意图:定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知

  • 观察者模式 亦称: 事件订阅者、监听者、Event-Subscriber、Listener、Observer 意图 观察者模式是一种行为设计模式, 允许你定义一种订阅机制, 可在对象事件发生时通知多个 “观察” 该对象的其他对象。 问题 假如你有两种类型的对象: ​ 顾客和 商店 。 顾客对某个特定品牌的产品非常感兴趣 (例如最新型号的 iPhone 手机), 而该产品很快将会在商店里出售。 顾客

  • 一、定义 观察者模式(发布-订阅模式):其定义对象间一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都将得到通知。 在JavaScript中,一般使用事件模型来替代传统的观察者模式。 好处: (1)可广泛应用于异步编程中,是一种替代传递回调函数的方案。 (2)可取代对象之间硬编码的通知机制,一个对象不用再显示地调用另外一个对象的某个接口。两对象轻松解耦。 二、DOM事件–观察者

  • 当对象间存在一对多关系时,则使用观察者模式(Observer Pattern)。比如,当一个对象被修改时,则会自动通知它的依赖对象。观察者模式属于行为型模式。 介绍 意图:定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。 主要解决:一个对象状态改变给其他对象通知的问题,而且要考虑到易用和低耦合,保证高度的协作。 何时使用:一个对象(目标对象)

  • 观察者模式是软件设计模式的一种。在此种模式中,一个目标对象管理所有相依于它的观察者对象,并且在它本身的状态改变时主动发出通知。这通常透过呼叫各观察者所提供的方法来实现。此种模式通常被用来实时事件处理系统。 定义一个目标构造函数,并实现绑定、解绑和触发等方法: function Subject() { this.events = {}; this.count = 0; }​ Subj