Observer를 주제로 사용할 때 상황이 생깁니다. A와 B의 두 개의 엔테이트 A와 B가있는 이미지를 만듭니다. A의 모델에서 변경이 발생하면 다른 엔티티는 B (C, D ... 등)를 포함하여 알아야합니다.옵저버 패턴 무한 루프
B의 모델에서 변경이 발생하면 다른 엔테이트가 A (C, D ... 등)를 알아야합니다. 내가 무한 루프 betteween A를 얻을와 B가
는 관찰자 pattren가 제대로 implmented되지 않았거나 내가 디자인의이 종류를 처리하기 위해 다른 pattren 필요합니까 이런 식으로 옵저버 패턴을 implmenting으로
?
어떤 방법 그녀의 내 구현
public interface ISubject {
public void registreObserver(IObserver obs);
public void removeObserver(IObserver obs);
public void notifyObservers();
}
그리고 옵저버 인터페이스
public interface IObserver {
public void update(ISubject subject);
}
모델
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
수입 인 java.util.ArrayList; import 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);
}
}
}
다음은 컨트롤러
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();
}
}
B 조 컨트롤러
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();
}
}
메인 프로그램
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();
}
}
이 코드 예제는 모든 구문 오류를 해결할 때 무한 루프를 작성하지 않습니다. "B Changed"가 출력되고 종료됩니다. – explv
데이터를 모델에로드하는 데 실패했습니다. 이제 무한 루프가 생기고 루프를 피하거나 pattren을 사용하여보다 적절한 모델을 사용하려고합니다. –
왜 직접 패턴을 구현하고 있습니까? 즉, 자신의 인터페이스와 물건을 만드시겠습니까? 이 패턴에 필요한 인터페이스와 클래스는 이미 Java에서 구현됩니다. 즉, 클래스 'Observable' (클래스라는 이름에도 불구하고 관찰되는 객체) 및 인터페이스'Observer '입니다. –