본문 바로가기
Java

옵저버 패턴(Observer Pattern)

by it's woo 2021. 9. 23.

옵저버 패턴이란?

객체 간 1:N 의존관계를 정의하며 한 개의 객체 상태가 변경될 때 그 객체와 의존 관계에 있는 모든 객체들이 자동으로 알림을 받고 상태를 갱신합니다.

객체의 상태변화를 지켜보는 옵저버를 통하여 변경 사항을 전달하고 옵저버를 통해 연결된 객체들이 변화를 알고 갱신합니다.

흔히 이벤트 기반 시스템을 구현하는 데 사용되는 패턴입니다.

옵저버 패턴의 예시를 보자

 

뉴스레터와 구독자들이 있다고 생각하자

여려 명의 사람이 뉴스레터의 구독자가 되었다고 하자

뉴스레터의 새로운 기사가 생겼으면 구독자들에게 새로운 기사가 있다고 구독자들에게 변경사항을 알린다.

구독을 하지 않은 비구독자는 변경사항을 모른다.

 

느슨한 결합

 

옵저버 패턴의 특징은 느슨한 결합입니다.

그림을 보자

뉴스레터처럼 관찰대상이 되는 객체를 Subject라고 표현하며 상태 변화를 관찰하는 객체들을 Observer라고 한다.

위의 예시는 옵저버 패턴의 간단한 구조입니다.

인터페이스(혹은 추상 클래스)가 연결돼있을 뿐 그것들을 구현한 클래스들은 서로에 대해 잘 알지 못합니다.

이러한 느슨한 결합은 확장성에 유용합니다.

옵저버들을 인터페이스를 구현하여 생성되기 때문에 옵저버 추가 삭제를 해도 서브젝트에 전혀 영향을 주지 않습니다.

 

옵저버 패턴 예시

public interface Subject {
	public void registerObserver(Observer o);
	public void removeObserver(Observer o);
	public void notifyObservers();
}

Subject 인터페이스입니다. 

Observer의 등록, 제거, 갱신을 제공합니다.

public interface Observer {
	public void update(int change);
}

Observer 인터페이스입니다.

Subject의 값을 관찰하게 만들었습니다.

public class ConcreteSubject implements Subject{
	private ArrayList observers;
	
	private int change;
	
	public  ConcreteSubject() {
		observers = new ArrayList();
	}
	@Override
	public void registerObserver(Observer o) {
		observers.add(o);
	}
	@Override
	public void removeObserver(Observer o) {
		int i= observers.indexOf(o);
		if (i>= 0) {
			observers.remove(i);
		}
	}
	@Override
	public void notifyObservers() {
		for (int i= 0; i< observers.size(); i++) {
			Observer observer= (Observer) observers.get(i);
			observer.update(i);
		}
	}
}

Subject 클래스는 ArrayList에 Observer를 저장합니다. 

인터페이스를 구현하여 Observer들을 관리합니다.

notifyObservers를 통해 update메서드가 호출되어 갱신을 합니다.

public class ConcreteObserver implements Observer {
	private Subject s;
    private int change;
    
    public ConcreteObserver(Subject s) {
    	this.s = s;
    	s.registerObserver(this);
    }
    @Override
    public void update(int change) {
    	this.change = change;
    }  
}

Observer들은 서브젝트의 등록하고 변화에 따라 갱신합니다.

'Java' 카테고리의 다른 글

BigInteger  (0) 2021.11.03
스트래티지 패턴(Strategy Pattern)  (0) 2021.09.17