개발자의 스터디 노트
자바 디자인패턴 - 옵저버 패턴(Observer Pattern) 본문
이번 포스팅은
https://coding-factory.tistory.com/710
위의 포스팅을 보고 작성하였습니다.
옵저버 패턴이란
- 객체의 상태 변화를 관찰하는 관찰자들, 즉 옵저버들의 목록을 객체에 등록하여 상태 변화가 있을 때마다 메서드 등을 통해 객체가 직접 목록의 각 옵저버에게 통지하도록 하는 디자인 패턴입니다. 어떤 객체에 변경사항이 발생하였을 때 이와 연관된 객체들에게 알려주는 디자인 패턴이라고 생각하면 됩니다.
옵저버 패턴에는 주체 객체와 상태의 변경을 알아야 하는 관찰 객체(Observer Object)가 존재하며 이들의 관계는 1:1이 될 수도 있고, 1:N이 될 수도 있습니다.
옵저버 패턴의 장점
1. 실시간으로 한 객체의 변경사항을 다른 객체에 전파할 수 있습니다.
2. 느슨한 결합으로 시스템이 유연하고 객체 간의 의존성을 제거할 수 있습니다.
옵저버 패턴의 단점
1. 너무 많이 사용하게 되면, 상태 관리가 힘들 수 있습니다.
2. 데이터 배분에 문제가 생기면 자칫 큰 문제로 이어질 수 있습니다.
옵저버 패턴 사용 예제
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를 만듭니다.
Notice.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);
}
}
'자바 > 인스턴트코드' 카테고리의 다른 글
자바 버전별 정리 (0) | 2022.04.14 |
---|---|
자바 디자인패턴 - 프록시 패턴(Proxy Pattern) (0) | 2022.04.13 |
자바 디자인패턴 - 템플릿 메서드 패턴(Template Method Pattern) (0) | 2022.04.13 |
자바 디자인패턴 - 팩토리 패턴(Factory Pattern) (0) | 2022.04.13 |
자바 디자인패턴 - 싱글톤(Singleton) (0) | 2022.04.11 |