我有一个接收消息的java应用程序(使用RabbitMQ)。但我不知道如何将观察者模式应用于此。 传入消息包含位置String和事件String。
申请结构:
适配器
域
我希望这是足够的信息。
答案 0 :(得分: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,并且此对象将数据发送到观察者对象。 同时使观察者对象提供对象的对象的引用,即你的观察者对象可以自己注册它作为主体对象的观察者