옵저버 패턴(Observer Pattern)
변화가 일어 났을 때, 미리 등록된 다른 클래스에 통보해주는 패턴을 구현하는 것입니다.
일대다(one-to-many) 의존성을 가지며, 분산 이벤트 핸들링 시스템을 구현하는 데 사용됩니다.
ex) event listener
옵저버 패턴 흐름
1. 일 대 다 관계로 구성
2. 관찰 대상의 상태가 변경되면 옵저버 한테 통보
3. 통보 받은 값을 바꿀 수 있고, 삭제 하는 등의 적절한 대응을 합니다.
4. 일 대 다 관계의 그룹에서 추가/삭제 될 수 있으며 그로 인하여 정보를 전달 받거나 받을 수 없게 합니다.
옵저버 패턴 특징
1. 대상 객체의 상태가 변경될 때마다 다른 객체의 동작을 트리거해야 할때
2. 앱이 한정된 시간, 특정한 케이스에만 다른 객체를 관찰해야 할 때
3. 한 객체의 상태가 변경되면 다른 객체도 변경해야 할 때
옵저버 패턴 장점
1. 일대다 관계에서 일(one)의 상태 변경을 주기적으로 조회하지 않고 자동으로 감지할 수 있습니다.
2. 일(one)의 코드를 변경하지 않고도 새 다(many) 클래스를 도입할 수 있어 개방폐쇄 원칙을 준수합니다.
3. 런타임 시점에서 연관 관계를 맺스브니다.
4. 상태를 변경하는 객체와 변경을 감지하는 객체의 관계를 느슨하게 유지할 수 있습니다.
옵저버 패턴 단점
1. 알림 순서를 제어할 수 없고, 무작위 순서로 알림을 받습니다. 가능하지만 복잡성과 결합성만 높아집니다.
2. 패턴을 자주 구성하면 구조와 동작을 알아보기 힘들어져 코드 복잡도가 증가합니다.
3. 다수의 옵저버 객체를 등록 이후 해지하지 않는다면 메모리 누수가 발생합니다.
옵저버 패턴 코드
관찰자 인터페이스
/**
* 관찰자 인터페이스
*/
public interface IObserver {
void update();
}
관찰자 클래스
public class Observer implements IObserver{
@Override
public void update() {
System.out.println("업데이트 사항이 존재하여 이벤트 알림 발생");
}
}
타겟 인터페이스
/**
* 옵저버가 관찰할 대상 인터페이스
*/
public interface ITarget {
void notifiy();
void addObserver(IObserver o); // 옵저버 추가
void removeObserver(IObserver o); // 옵저버 제거
}
타겟 클래스
import java.util.ArrayList;
import java.util.List;
public class Target implements ITarget{
List<IObserver> observerList = new ArrayList<>();
@Override
public void notifiy() {
for(IObserver o : observerList){
o.update();
}
}
@Override
public void addObserver(IObserver o) {
observerList.add(o);
System.out.println("그룹 대상 추가 : "+o);
}
@Override
public void removeObserver(IObserver o) {
observerList.remove(o);
System.out.println("그룹 대상 삭제 : "+o);
}
}
메인 실행
public class NotifyMain {
public static void main(String[] args) {
/** 관찰 대상 생성 */
ITarget t = new Target();
/** 대상 옵저버 생성 */
IObserver ob1 = new Observer();
IObserver ob2 = new Observer();
/** 그룹에 옵저버 추가 */
t.addObserver(ob1);
t.addObserver(ob2);
/** 그룹 내 옵저버들에게 알림 */
t.notifiy();
/** 그룹에 옵저버 삭제 */
t.removeObserver(ob2);
/** 그룹 내 속한 ob2를 제외한 옵저버들에게 알림 */
t.notifiy();
}
}
그룹 대상 추가 : com.pattern.design.observer.Observer@372f7a8d
그룹 대상 추가 : com.pattern.design.observer.Observer@2f92e0f4
업데이트 사항이 존재하여 이벤트 알림 발생
업데이트 사항이 존재하여 이벤트 알림 발생
그룹 대상 삭제 : com.pattern.design.observer.Observer@2f92e0f4
업데이트 사항이 존재하여 이벤트 알림 발생
참고
'Spring > 0. Design Pattern' 카테고리의 다른 글
4. 팩토리 메소드 패턴(Factory method pattern) (0) | 2024.06.03 |
---|---|
3. 프록시 패턴(Proxy Pattern) (0) | 2024.05.27 |
2. 어댑터 패턴(Adapter Pattern) (0) | 2022.09.09 |
1. 싱글톤 패턴(Singleton Pattern)과 멀티스레드 환경의 싱글톤 패턴 (0) | 2022.08.01 |