첫 만남
신문 및 사용자
흥미로운 일이 발생했을 때 절대 놓치지 않을 관찰자 모드! 아래 그림은 옵저버 모드의 도입부에서 가장 많이 등장하는 옵저버 모드의 개략도이며 가장 고전적이기도 하다.
- 사용자가 신문사에서 신문을 구독한 후 신문사가 새 신문을 발행하면 이를 사용자에게 푸시합니다.
- 사용자가 구독을 취소한 후에는 신문사에서 새로운 신문을 발행하더라도 사용자에게 푸시되지 않습니다.
구현 및 결함
- 각 사용자 개체에 대한 참조를 포함하여 신문 개체 만들기
- 신문 뉴스가 변경되면 각 사용자 개체의 변경 메서드를 호출합니다.
- 사용자를 추가해야 하는 경우 사용자 개체를 만드는 것 외에도 신문 개체를 변경해야 합니다.
- 사용자를 제거해야 하는 경우 신문 클래스의 메서드도 변경해야 합니다.
이 디자인 아이디어는 요구 사항이 변경됨에 따라 신문과 사용자 개체를 지속적으로 변경하는 것입니다.확장성 및 유지 관리성이 낮고 런타임에 동적으로 교체할 수 없습니다., 어떻게 이것을 할 수 있습니까? 우리 观察者模式
데뷔~
게시자 + 구독자 = 관찰자 패턴
위의 제목은 이해하기 쉬운 정의입니다. 관찰자 모드의 정의에는 두 개의 명사가 있습니다.
- 게시자에 해당하는 주제(Subject)
- 옵저버(Observer), 가입자에 해당
정의
객체 간의 일대다 종속성을 정의하여 객체가 상태를 변경하면 모든 종속 항목에 알림이 전송되고 자동으로 업데이트됩니다.
이점
느슨한 결합
- 주체는 관찰자가 특정 클래스가 아닌 특정 인터페이스를 구현한다는 것만 알고 있습니다.
- 관찰자는 언제든지 추가할 수 있습니다.
- 관찰자는 언제든지 제거할 수도 있습니다.
- 옵저버는 런타임 시 마음대로 교체할 수 있습니다.
- 주제 또는 관찰자는 독립적으로 재사용 가능
- 하나를 변경해도 다른 하나에 영향을 주지 않음
경우
Java 내장 Observer 및 Observable
Observer와 Observable의 소스 코드는 직접 확인할 수 있으며, 다음은 주로 Observable.notifyObservers() 메서드에 대해 설명합니다: 변경 플래그, 주제 푸시 수신 여부를 제어합니다 . 콘텐츠!
package java.util;
public class Observable {
// ...
public void notifyObservers(Object arg) {
/*
* a temporary array buffer, used as a snapshot of the state of
* current Observers.
*/
Object[] arrLocal;
synchronized (this) {
if (!changed)
return;
arrLocal = obs.toArray();
clearChanged();
}
for (int i = arrLocal.length-1; i>=0; i--)
((Observer)arrLocal[i]).update(this, arg);
}
protected synchronized void clearChanged() {
changed = false;
}
}
추후 추가 예정...