반응형
옵저버 패턴이란?
- 객체의 상태 변화를 관찰하는 관찰자들 즉, 옵저버들의 목록을 객체에 등록하여 상태 변화가 있을 때마다 메서드등을 통해 객체가 직접 목록의 각 옵저버에게 통지하도록 하는 디자인 패턴이다.
- 어떤 객체의 변경 사항이 발생하였을때 이와 연관된 객체들에게 알려주는 디자인 패턴이라고 생각하면 된다.
다수의 객체가 특정 객체 상태 변화를 감지하고 알림을 받는 패턴
- 발행(publish) - 구독 (subscribe) 패턴을 구현할 수 있다
옵저버 패턴 사용 예제
공지사항을 알리때를 예제로 공지사항을 전파할때(상태변환) 옵저버와 관련된 객체들(유저들)에게 통지하도록 하는 간단한 예제를 옵저버 패턴으로 만들어보도록 하겠다.
Observer.class
public class Observer {
public String msg;
public void receive(String msg){
System.out.println(this.msg + "에서 메시지를 받음 : " + msg);
}
}
옵저버 클래스를 정의하여 공지사항을 받았을 경우 알림을 출력하는 receive함수를 만듭니다.
User1.class
public class User1 extends Observer{
public User1(String msg){
this.msg = msg;
}
}
Observer를 상속받는 user1을 만듭니다.
User2.class
public class User2 extends Observer{
public User2(String msg) {
this.msg = msg;
}
}
Observer를 상속받는 user2을 만듭니다.
Observer.class
import java.util.ArrayList;
import java.util.List;
public class Notice {
private List<Observer> observers = new ArrayList<Observer>();
// 옵저버에 추가
public void attach(Observer observer){
observers.add(observer);
}
// 옵저버에서 제거
public void detach(Observer observer){
observers.remove(observer);
}
// 옵저버들에게 알림
public void notifyObservers(String msg){
for (Observer o:observers) {
o.receive(msg);
}
}
}
옵저버에 공지사항을 받을 유저를 추가하고 삭제하며 공지사항을 전파하는 기능을 가진 Notice클래스를 만듭니다.
Main.class
public class Main {
public static void main(String[] args) {
Notice notice = new Notice();
User1 user1 = new User1("유저1");
User2 user2 = new User2("유저2");
notice.attach(user1);
notice.attach(user2);
String msg = "공지사항입니다~!";
notice.notifyObservers(msg);
notice.detach(user1); // user1 공지사항 받는 대상에서 제거
msg = "안녕하세요~";
notice.notifyObservers(msg);
}
}
장점
- 실시간으로 한 객체의 변경사항을 다른 객체에 전파할 수 있다.
- 느슨한 결합으로 시스템이 유연하고 객체간의 의존성을 제거할 수 있다
단점
- 너무 많이 사용하게 되면, 상태 관리가 힘들 수 있다.
- 데이터 배분에 문제가 생기면 자칫 큰 문제로 이어질 수 있다.
Script
어떤 객체의 상태가 변할 때 그와 연관된 객체 들에게 알림을 보내는 디자인 패턴
참고
'디자인패턴' 카테고리의 다른 글
디자인 패턴 (0) | 2023.08.02 |
---|---|
메멘토 패턴(Memento Pattern) (1) | 2022.10.08 |
커맨드 패턴 (Command Pattern) (0) | 2022.10.08 |
책임 연쇄 패턴(Chain of Responsibility Pattern) (0) | 2022.10.08 |
템플릿 메소드 패턴(Template Method Pattern) (1) | 2022.09.25 |