Post

옵저버 패턴 소개: 변화 감지와 알림 구현하기

옵저버 패턴이 뭘까??


옵저버 패턴은 어떤 하나의 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 의 무서움에서 벗어 날 수 있다!

This post is licensed under CC BY 4.0 by the author.

© 병욱. Some rights reserved.