옵저버 패턴 이해하기

SeungJoo
|2025. 1. 20. 00:47
728x90
반응형

소프트웨어 개발에서 디자인 패턴은 문제를 효과적으로 해결하는 데 도움을 주는 재사용 가능한 솔루션을 제공합니다. 그중 옵저버 패턴은 한 객체의 상태 변화가 다른 객체에 자동으로 전파되어야 할 때 유용합니다.

옵저버 패턴이란?

옵저버 패턴은 1:N 관계에서 사용됩니다.

한 객체(발행자 Subject)의 상태가 바뀌면 이 객체를 관찰하는 다른 객체(옵저버, Observer)에게 자동으로 알림이 전달됩니다. 이를 통해 객체 간의 결합도를 낮추고 시스템을 유연하게 설계할 수 있습니다.

헤드헌터와 개발자

구성 요소

Recruiter (헤드헌터)

발행자(Observable) 역할을 하며, 새로운 채용 공고를 구독 중인 개발자들에게 알립니다.

새로운 공고가 등록되면 notifyDevelopers() 메서드를 통해 모든 구독자 알림을 보냅니다.

Developer (개발자)

옵저버(Observer) 역할을 하며, 알림을 받고 각자 정의된 동작(예: 채용 공고 확인)을 수행합니다.

update() 메서드를 통해 알림을 처리합니다.

관계와 동작

Recruiter ➔ Developer

헤드헌터는 구독 리스트를 관리

구독된 개발자들을 등록하거나 해지하며, 상태 변화 시 알림을 전송합니다.

개발자는 헤드헌터의 알림에 반응

채용 공고를 확인하거나 필요에 따라 다른 동작을 수행합니다

 

옵저버 패턴의 장점

1. 객체 간의 결함도 감소

발행자와 옵저버는 느슨하게 연결되어 있어 서로의 세부 구현에 의존하지 않습니다.

2. 유연성 확장성

새로운 옵저버가 추가되더라도 발행자는 기존 코드를 수정할 필요 없이 새로운 옵저버를 구독 리스트에 등록하기만 하면 됩니다.

3. 자동화된 업데이트

옵저버는 발행자의 상태 변화를 수동으로 확인할 필요 없이, 자동으로 알림을 받을 수 있습니다.

 

옵저버 패턴 CODE

Subject (발행자)

import java.util.ArrayList;
import java.util.List;

// Subject (발행자)
class Recruiter {
    private List<Developer> developers = new ArrayList<>(); // 구독 중인 개발자 리스트

    // 구독 추가
    public void subscribe(Developer developer) {
        developers.add(developer);
        System.out.println(developer + " 개발자가 구독을 시작했습니다.");
    }

    // 구독 해제
    public void unsubscribe(Developer developer) {
        developers.remove(developer);
        System.out.println(developer + " 개발자가 구독을 해제했습니다.");
    }

    // 채용 공고 알림
    public void notifyDevelopers(String jobPost) {
        System.out.println("헤드헌터: 새로운 채용 공고를 알립니다 - " + jobPost);
        for (Developer developer : developers) {
            developer.update(jobPost); // 각 개발자에게 알림
        }
    }
}

Observer (옵저버 인터페이스)

// Observer (옵저버)
interface Developer {
    void update(String jobPost);
}

Concrete Observer (구체적인 옵저버)

// Concrete Observer
class ConcreteDeveloper implements Developer {
    private String name; // 개발자 이름

    public ConcreteDeveloper(String name) {
        this.name = name;
    }

    @Override
    public void update(String jobPost) {
        System.out.println(name + ": 새로운 채용 공고를 확인했습니다 - " + jobPost);
    }

    @Override
    public String toString() {
        return name;
    }
}

ObserverPatternMain(클라이언트)

public class ObserverPatternExample {
    public static void main(String[] args) {
        // 발행자(헤드헌터) 생성
        Recruiter recruiter = new Recruiter();

        // 옵저버(개발자) 생성
        Developer dev1 = new ConcreteDeveloper("홍길동");
        Developer dev2 = new ConcreteDeveloper("김길동");
        Developer dev3 = new ConcreteDeveloper("이길동");

        // 개발자 구독
        recruiter.subscribe(dev1);
        recruiter.subscribe(dev2);

        // 채용 공고 알림
        recruiter.notifyDevelopers("백엔드 개발자 모집 공고");

        // 개발자 1 구독 해제
        recruiter.unsubscribe(dev1);

        // 새로운 채용 공고 알림
        recruiter.notifyDevelopers("프론트엔드 개발자 모집 공고");

        // 개발자 3 구독 추가
        recruiter.subscribe(dev3);

        // 또 다른 채용 공고 알림
        recruiter.notifyDevelopers("풀스택 개발자 모집 공고");
    }
}

 

728x90
반응형

'JAVA' 카테고리의 다른 글

데코레이터(Decorator) 패턴  (1) 2025.01.26
전략 패턴(Strategy Pattern)  (0) 2025.01.12
Call By Value와 Call By Reference  (0) 2024.03.03