【问题标题】:How do I apply Observer Pattern with a jms receiver如何将观察者模式与 jms 接收器一起应用
【发布时间】:2015-11-07 06:48:00
【问题描述】:

我有一个接收消息的 java 应用程序(使用 RabbitMQ)。但我不知道如何将观察者模式应用于此。 传入的消息包含一个位置字符串和一个事件字符串。

应用结构:

  • 适配器

    • MovementAPI -> 处理来自 RabbitMQ 的传入消息的类
  • 域名

    • 控制器 -> 具体的观察者?
    • 留言
    • (i) 观察员
    • (i) 主题

我希望这是足够的信息。

【问题讨论】:

  • 你能说明你对观察者模式的理解吗?您还可以提供将调用观察者的代码吗?

标签: java jms rabbitmq observer-pattern


【解决方案1】:

观察者模式的基本原理是,您将有一个主题,该主题将向其广播已注册的对象(谁是观察者)将被通知

-- 制作一个将由您的观察者实施的以下界面。

public interface Observer {
void update(String incident, String position);
}

制作另一个接口,该接口将由必须广播消息的主题实现

 public interface Subject {

    void registerObserver(Observer observer);

    void removeObserver(Observer observer);

    void notifyObservers();
}

让你的类修改谁的对象将通知其他观察者对象

public class YourBroadCastObjectData implements Subject {

private ArrayList<Observer> observers;
private String incident;
private String position;

public YourBroadCastObjectData() {
    // TODO Auto-generated constructor stub
    observers = new ArrayList<>();
}

@Override
public void notifyObservers() {
    // TODO Auto-generated method stub
    for (int i = 0; i < observers.size(); i++) {
        Observer observer = observers.get(i);
        observer.update(this.incident, this.position);
    }
}

@Override
public void registerObserver(Observer observer) {
    // TODO Auto-generated method stub
    observers.add(observer);

}

@Override
public void removeObserver(Observer observer) {
    // TODO Auto-generated method stub
    int i = observers.lastIndexOf(observer);
    if (i >= 0) {
        observers.remove(i);
    }

}

public void dataChanged() {
    notifyObservers();
}

public void setData(String incident, String position) {
    this.incident= incident;
    this.position= position;
    dataChanged();
}

public float getIncident() {
    return incident;
}

public float getPosition() {
    return position;
}



}

据我所知,您将有一个异步线程将数据从 RabbitMQ 服务获取到您的应用程序,在该线程中让您的主题通知所有对象。

你必须为你的类实现观察者接口,你想充当观察者的对象。在线查看一些示例以了解观察者模式的工作原理。

Java 提供了对观察者模式的内置支持,但它是您必须继承的具体类。

为了提供更灵活的设计,您最好根据需要制作自己的图案。

以上代码将帮助您推送数据(示例..事件和位置),但您也可以制作拉模式

当您要实现 RabbitMQ 时,您必须有一些数据在服务器上不断更新,并且您的消费者代码已连接到服务器上的 RabbitMQ 服务的生产者。

一旦您从消费者代码中获取数据,您就可以将任何类作为主体 (YorBroadCastObjectData) 来实现 SUbject,并且该对象会将数据发送给观察者对象。 在让观察者对象引用您的主体对象时,您的观察者对象可以将其自己注册为主体对象的观察者

【讨论】:

  • 谢谢,但你认为哪门课是最好的科目?你使用 YourBroadCastObjectData,我还在怀疑 Message 和 MovementAPI。
猜你喜欢
  • 2019-11-30
  • 1970-01-01
  • 1970-01-01
  • 2010-09-23
  • 2013-02-12
  • 2014-10-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多