옵저버 패턴
접근
값의 변화, 새로운 소식 등의 이벤트가 발생하면 이를 특정 객체가 항상 확인하여 자신의 필드 등에 반영해주어야 한다면?
이벤트를 확인해야 하는 객체가 여러 개라면?
데이터를 관리하는 측에서 이벤트가 발생하면 이를 주시하고 있는 객체들에게 알려야 한다.
상호작용하는 객체 사이에는 가능하면 느슨한 결합을 사용해야 한다.
개념
한 객체의 상태가 바뀌면 그 객체에 의존하는 여러 객체에 이벤트를 알리는 구독 메커니즘을 정의할 수 있도록 한다.
주제 객체는 주제와 관련된 데이터를 관리하며 이벤트가 발생하면 옵저버에게 소식을 전한다.
옵저버 객체들은 주제를 구독하여 이벤트를 전달받아 반영한다. 구독을 취소할 수도 있다.
새로운 옵저버를 추가하더라도 주제 클래스에 변경이 일어나지 않는다.
Publish-Subscribe 패턴의 경우 서로 다른 유형의 메시지에 관심을 가질 수 있고 Publisher와 Subscriber를 더 세세하게 분리할 수 있으므로, 주제가 직접 옵저버에게 메시지를 전달하는 옵저버 패턴과는 다른 형태이다.
사용 방법
주제 인터페이스와 옵저버 인터페이스를 정의하여 이를 각각 구현하도록 한다.
주제는 여러 옵저버들을 필드로 가지며, 등록을 요청한 옵저버들에게 이벤트 발생 시 전달하는 notifyObservers 메서드를 구현한다.
이 때 내용을 전달하기 위해 옵저버의 update 메서드를 호출한다.
update 메서드에 이벤트에 대한 데이터를 직접 전달할 수도 있고, update 메서드 내부에서 주제 객체의 getter를 호출해 데이터를 직접 가져와 사용할 수도 있다.
예시
날씨 정보가 변화할 때 각 화면에 변화를 주기 위해서 옵저버 패턴을 사용할 수 있다.
날씨 정보에 대한 데이터를 담당하는 클래스가 주제가 된다. 따라서 옵저버들을 등록/제거하는 메서드와 옵저버들에게 이벤트를 알리는 메서드를 구현한다.
계속해서 변경되는 날씨 데이터를 표현하는 화면 클래스들은 옵저버가 된다. 주제로부터 갱신된 데이터를 받아 처리하기 위한 메서드를 구현한다.
Last updated