옵저버 패턴 소개: 변화 감지와 알림 구현하기
옵저버 패턴이 뭘까??
옵저버 패턴은 어떤 하나의 publisher class 가 어떻게 변화하는지 어떻게 행동하는 subscribe 라는 행동으로 구독하고 변화과정 행동과정을 받아 볼 수 있는 패턴이다! 생각보다 간단하다! 한번 구현해보자!
예를 들어 홈플러스가 있다고 치자. 그리고 사람 한명 한명이 그 홈플러스에 업데이트되는 제품들을 구독하는 코드를 만들어 보겠다!
옵저버 클래스에는 publisher class 가 업데이트를 알리려고할때 update method 를 만들어 준다. 아래의 코드에서 update 는 이제 publisher class 가 업데이트 되었을때 아래의 method 를 통해 알려주는 역할이다.
1
2
3
4
5
6
7
8
9
public interface People {
void update(String content);
}
public class Wook implements People {
public void update(String content) {
//content가 업데이트 되었어용
}
}
옵저버가 관찰하려고하는 publisher class 는 subscribe, unsubscribe 그리고 broadcast 처럼 옵저버들에게 알리는 메소드를 포함해 준다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
public interface Publisher {
void subscribe (People people);
void unsubscribe (People people);
void broadcast (String content);
}
public class Homeplus implements Publisher {
List<People> peopleList = new ArrayList<People>;
public void updateItem (String itemName) {
// 아이템 업데이트 코드
broadcast(itemName + "이 추가되었어요");
}
public void subscribe (People people) {
peopleList.add(people);
}
public void unsubscribe (People people) {
peopleList.remove(people);
}
public void broadcast (String content) {
peopleList.foreach(people -> people.update(content));
}
}
그럼 이제 아래처럼 코드를 만들면 이제 wook이 homeplus 를 구독한 셈이 되는것이다.
1
2
3
Wook wook = new Wook();
Homeplus homeplus = new Homeplus();
homeplus.subscribe(wook);
이제 homeplus 에 새로운 품목이 updateItem
으로 추가가 된다면 wook 도 알림을 받게 된다!
언제 사용하면 될까 ?
위에처럼 1 대 n 대응 관계에 있는 구조라면 옵저버 패턴을 사용하면 유용하다. 또한 주기적으로 계속해서 homeplus 의 상태를 확인하지 않아도 되는 장점이 있다!!
주의해야 할점
주의해야할점도 열심히 찾아봤다. 우선 list 로 observer 들이 구성되어있어서 순위가 없다. 이를 순서가 있도록 할 수 있지만 좋은 방법은 아니라고 한다! 또한 observer 가 없어질땐 꼭 unsubscribe 하고 메모리 해제를 해주어야 mem leak 의 무서움에서 벗어 날 수 있다!