헤드 퍼스트 디자인 패턴 - 옵저버 패턴(요약)

첫 만남

신문 및 사용자

    흥미로운 일이 발생했을 때 절대 놓치지 않을 관찰자 모드! 아래 그림은 옵저버 모드의 도입부에서 가장 많이 등장하는 옵저버 모드의 개략도이며 가장 고전적이기도 하다.

  • 사용자가 신문사에서 신문을 구독한 후 신문사가 새 신문을 발행하면 이를 사용자에게 푸시합니다.
  • 사용자가 구독을 취소한 후에는 신문사에서 새로운 신문을 발행하더라도 사용자에게 푸시되지 않습니다.

신문 구독 흐름도

구현 및 결함

  1. 각 사용자 개체에 대한 참조를 포함하여 신문 개체 만들기
  2. 신문 뉴스가 변경되면 각 사용자 개체의 변경 메서드를 호출합니다.
  3. 사용자를 추가해야 하는 경우 사용자 개체를 만드는 것 외에도 신문 개체를 변경해야 합니다.
  4. 사용자를 제거해야 하는 경우 신문 클래스의 메서드도 변경해야 합니다.

이 디자인 아이디어는 요구 사항이 변경됨에 따라 신문과 사용자 개체를 지속적으로 변경하는 것입니다.확장성 및 유지 관리성이 낮고 런타임에 동적으로 교체할 수 없습니다., 어떻게 이것을 할 수 있습니까? 우리 观察者模式데뷔~


게시자 + 구독자 = 관찰자 패턴

    위의 제목은 이해하기 쉬운 정의입니다. 관찰자 모드의 정의에는 두 개의 명사가 있습니다.

  • 게시자에 해당하는 주제(Subject)
  • 옵저버(Observer), 가입자에 해당

정의

객체 간의 일대다 종속성을 정의하여 객체가 상태를 변경하면 모든 종속 항목에 알림이 전송되고 자동으로 업데이트됩니다.

클래스 다이어그램

이점

느슨한 결합

  • 주체는 관찰자가 특정 클래스가 아닌 특정 인터페이스를 구현한다는 것만 알고 있습니다.
    • 관찰자는 언제든지 추가할 수 있습니다.
    • 관찰자는 언제든지 제거할 수도 있습니다.
    • 옵저버는 런타임 시 마음대로 교체할 수 있습니다.
  • 주제 또는 관찰자는 독립적으로 재사용 가능
  • 하나를 변경해도 다른 하나에 영향을 주지 않음

경우

Java 내장 Observer 및 Observable

Java의 내장 관찰자 패턴과 관련된 클래스 다이어그램

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;
    }

}

추후 추가 예정...

추천

출처blog.csdn.net/huhui806/article/details/110424960