상세 컨텐츠

본문 제목

[Design Pattern] Observer Pattern

JAVA

by jeonghojin 2023. 3. 18. 05:44

본문

Observer Pattern

객체의 상태 변화를 관찰하는 관찰자(Observer)들의 목록을 객체에 등록하여 상태 변화가 있을 때마다 notify를 통해 객체가 직접 목록의 각 옵저버에게 통지하도록 하는 디자인 패턴
* 어떤 객체의 변경사항이 발생했을 때 이와 연관된 객체들에게 알려주는 디자인 패턴
* 발행 / 구독 모델
 

 


 
Interface Observer

public interface Observer {

    String getName();
    void update(String message);
}

 
Interface Publisher

public interface Publisher {
    void add(Observer observer);
    void delete(Observer observer);
    void notifyObserver(String message);
}

 
 
Abstract AbstractObserver

public abstract class AbstractObserver implements Observer{

    private String name;

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

    public String getName() {
        return this.name;
    }
    public void update(String message) {
        System.out.println(name+" 수신 : "+ message);
    }
}

 
Class Notice

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

public class Notice implements Publisher{

    List<Observer> observers = new ArrayList<>();

    @Override
    public void add(Observer observer) {
        System.out.println(observer.getName()+" 추가");
        observers.add(observer);
    }

    @Override
    public void delete(Observer observer) {
        System.out.println(observer.getName()+" 제거");
        observers.remove(observer);
    }

    @Override
    public void notifyObserver(String message) {

        for (Observer observer : observers) {
            observer.update(message);
        }
    }
}

 
Class User

public class User extends AbstractObserver{

    public User(String name) {super(name);}
}

 
Main

public class Main {
    public static void main(String[] args) {
        Notice notice = new Notice();
        User user1 = new User("유저 1");
        User user2 = new User("유저 2");
        notice.add(user1);
        notice.add(user2);

        notice.notifyObserver("알림 발송");
        notice.delete(user2);
        notice.notifyObserver("알림 발송");

    }
}

 
 


Observer Pattern 장/단점

장점 :
- 실시간으로 한 객체의 변경사항을 다른 객체에 전파
- 느슨한 결합으로 시스템이 유연하고 객체간의 의존성을 제거할 수 있다.
 
단점 :- 너무 많이 사용하게 되면, 상태 관리가 힘들어짐.- 데이터 배분 문제가 생기면 자칫 큰 문제로 이어질 수 있다.


참고 : 

더보기

'JAVA' 카테고리의 다른 글

[Design Pattern] Command Pattern  (0) 2023.03.21
[Design Pattern] Factory Method Pattern  (0) 2023.03.19
[Design Pattern] Template Method Pattern  (0) 2023.03.17
[java] ThreadPool  (1) 2023.02.23
[Java] Map 동시성  (1) 2022.12.22

관련글 더보기