Ich habe eine Situation, wenn ich einen Beobachter habe, um auch ein Thema sein. Also lassen Sie uns Bild mit haben zwei entities A und B. Wenn Änderungen in A-Modell auftreten, sollten andere entitys einschließlich B (C, D ... Etc) wissen.Observer Muster Endlosschleife
Wenn Änderungen in B's Model auftreten, sollten andere Entitäten wissen, einschließlich A (C, D ... Etc).
von implmenting das Beobachter-Muster auf diese Weise i eine Endlosschleife betteween A bekommen und B.
Ist der Beobachter pattren nicht implmented richtig oder muss ich eine andere pattren diese Art von Design behandeln?
Jede Art und Weise sie meine Implementierung
public interface ISubject {
public void registreObserver(IObserver obs);
public void removeObserver(IObserver obs);
public void notifyObservers();
}
und die Beobachter-Schnittstelle
public interface IObserver {
public void update(ISubject subject);
}
Das Modell
import java.util.ArrayList;
import java.util.List;
public class AModel implements ISubject {
private List<IObserver> listObservers = new ArrayList<>();
@Override
public void registreObserver(IObserver obs) {
listObservers.add(obs);
}
@Override
public void removeObserver(IObserver obs) {
listObservers.remove(obs);
}
public void loadData(){
notifyObservers();
}
@Override
public void notifyObservers() {
for (IObserver obv : listObservers) {
obv.update(AModel.this);
}
}
}
BModel
Import java.util.ArrayList; importieren java.util.List;
public class BModel implements ISubject {
private List<IObserver> listObservers = new ArrayList<>();
@Override
public void registreObserver(IObserver obs) {
listObservers.add(obs);
}
@Override
public void removeObserver(IObserver obs) {
listObservers.remove(obs);
}
public void loadData(){
notifyObservers();
}
@Override
public void notifyObservers() {
for (IObserver obv : listObservers) {
obv.update(BModel.this);
}
}
}
Der A-Controller
public class AController implements IObserver {
private AModel model;
public void setModel(AModel model) {
this.model = model;
}
@Override
public void update(ISubject subject) {
System.out.println(" A Changed");
model.loadData();
}
}
Die B-Controller
public class BController implements IObserver {
private BModel model;
public void setModel(BModel model) {
this.model = model;
}
@Override
public void update(ISubject subject) {
System.out.println(" B Changed");
model.loadData();
}
}
Hauptprogramm
public class Main {
public static void main(String[] args) {
AModel aModel = new AModel();
AModel bModel = new BModel();
AController aController = new AController();
aController.setModel(aModel);
AController bController = new BController();
bController.setModel(bModel);
aModel.registreObserver(bController);
bModel.registreObserver(aController);
// Here the updates starts a notify b and b notify a and so on
aModel.notifyObservers();
}
}
Dieses Codebeispiel erstellt keine Endlosschleife (wenn Sie alle Syntaxfehler beheben). Es druckt nur "B geändert" und beendet. – explv
Ich habe es versäumt, Daten in das Modell zu laden, jetzt erstellt es eine Endlosschleife und ich möchte entweder die Schleife vermeiden oder das Muster ändern, um ein geeigneteres zu verwenden. –
Warum implementieren Sie das Muster selbst, d. H. Erstellen Sie Ihre eigenen Schnittstellen und so? Die für dieses Muster benötigten Interfaces und Klassen sind bereits in Java implementiert, nämlich die Klasse "Observable" (Objekt, das beobachtet wird, trotz seines Namens ist es eine Klasse) und die Schnittstelle "Observer". –