ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 행동(Behavioral) - 관찰자(Observer) 패턴
    Java/디자인패턴 2024. 11. 14. 09:24
    반응형

    관찰자(Observer) 패턴은 행동(Behavioral) 디자인 패턴에 속합니다. 이 패턴은 객체 간의 일대다(one-to-many) 의존 관계를 정의하여, 한 객체의 상태 변화가 있을 때 이를 의존하고 있는 다른 객체들이 자동으로 통보 받고 업데이트되도록 설계합니다. 일반적으로, 이러한 관계는 "발행-구독(Publish-Subscribe)" 메커니즘을 사용하여 구현됩니다.

    Observer 패턴 개념 설명

    • 주체(Subject): 상태를 갖고 있으며, 상태가 변경되면 관찰자들에게 알리는 객체입니다.
    • 관찰자(Observer): 주체의 상태 변화에 반응하는 객체입니다. 주체에 등록된 여러 관찰자들은 주체가 변경될 때마다 업데이트를 받습니다.
    • 활용 예:
      • GUI 이벤트 시스템: 버튼 클릭이나 스크롤 동작 등 UI 상의 이벤트를 여러 UI 요소들이 관찰하고 업데이트하는 경우.
      • 알림 시스템: 뉴스 서비스, 소셜 미디어 알림 등에서 특정 상태 변경을 다수의 사용자에게 알릴 때.
      • 모니터링 시스템: 데이터나 시스템 상태가 변화할 때 자동으로 이를 감지하고 기록하거나 대응하는 경우.

    Java로 Observer 패턴 예시

    Observer 패턴을 Java로 구현하기 위해, Subject 인터페이스와 Observer 인터페이스를 정의하고, 이를 구현하는 클래스를 작성해보겠습니다.

    1. Subject 인터페이스

    import java.util.ArrayList;
    import java.util.List;
    
    interface Subject {
        void addObserver(Observer observer);
        void removeObserver(Observer observer);
        void notifyObservers();
    }

     

    2. Observer 인터페이스

    interface Observer {
        void update(String message);
    }

     

     

    3. ConcreteSubject 클래스 (주체 구현)

    class NewsAgency implements Subject {
        private List<Observer> observers = new ArrayList<>();
        private String news;
    
        public void setNews(String news) {
            this.news = news;
            notifyObservers();
        }
    
        @Override
        public void addObserver(Observer observer) {
            observers.add(observer);
        }
    
        @Override
        public void removeObserver(Observer observer) {
            observers.remove(observer);
        }
    
        @Override
        public void notifyObservers() {
            for (Observer observer : observers) {
                observer.update(news);
            }
        }
    }

     

     

    4. ConcreteObserver 클래스 (관찰자 구현)

    class NewsSubscriber implements Observer {
        private String name;
    
        public NewsSubscriber(String name) {
            this.name = name;
        }
    
        @Override
        public void update(String message) {
            System.out.println(name + " received news update: " + message);
        }
    }

     

     

    5. Main 클래스 (실행 예시)

    public class ObserverPatternDemo {
        public static void main(String[] args) {
            // 주체(Subject) 생성
            NewsAgency agency = new NewsAgency();
    
            // 관찰자(Observer) 생성
            NewsSubscriber subscriber1 = new NewsSubscriber("Alice");
            NewsSubscriber subscriber2 = new NewsSubscriber("Bob");
    
            // 관찰자 등록
            agency.addObserver(subscriber1);
            agency.addObserver(subscriber2);
    
            // 상태 변경 및 알림 전송
            agency.setNews("Breaking News: Observer Pattern Implemented in Java!");
    
            // 관찰자 제거 후 상태 변경
            agency.removeObserver(subscriber1);
            agency.setNews("Another Update: Subscriber Unsubscribed!");
        }
    }

     

     

    결과 출력

    Alice received news update: Breaking News: Observer Pattern Implemented in Java!
    Bob received news update: Breaking News: Observer Pattern Implemented in Java!
    Bob received news update: Another Update: Subscriber Unsubscribed!

    코드 설명

    1. Subject 인터페이스는 관찰자를 등록하고 제거하며, 상태 변경 시 관찰자들에게 알리는 기능을 정의합니다.
    2. Observer 인터페이스는 주체로부터 알림을 받을 때 수행할 동작을 정의합니다.
    3. NewsAgency 클래스는 Subject를 구현하며, 관찰자들에게 뉴스 업데이트를 전달합니다.
    4. NewsSubscriber 클래스는 Observer를 구현하여 뉴스 업데이트를 받을 때마다 해당 정보를 출력합니다.
    5. ObserverPatternDemo 클래스는 실제로 Observer 패턴을 사용하는 예시로, 주체와 관찰자를 생성하고 등록/삭제 후 상태 변화를 확인합니다.

    이 Observer 패턴을 통해 객체 간의 결합도를 낮추면서 이벤트 기반으로 여러 객체에 상태 변화를 자동으로 알릴 수 있습니다. 이로 인해 확장성과 유지보수성이 개선됩니다.

    반응형

    댓글

Designed by Tistory.