1. Observer Pattern이란
Observer Pattern은 객체간의 일대다 종속성을 설정하기 위해 사용되는 행위 디자인 패턴입니다. 구체적으로는 객체(주제 또는 관찰 가능한이라고 함)가 변화할 때 모든 종속성(옵저버라고 함)이 자동으로 통지되고 업데이트되는 패턴입니다. 이 패턴은 주제와 옵저버 간의 느슨한 결합을 가능케 하여 객체 간의 디커플링과 유연성을 달성할 수 있습니다.
2. Observer Pattern의 특징과 장점
Observer Pattern은 다음과 같은 특징과 장점을 가지고 있습니다:
- 주제와 옵저버 간의 느슨한 결합으로, 주제는 옵저버의 구체적인 구현 세부사항을 알 필요가 없습니다.
- 옵저버의 동적 추가 및 제거로 시스템이 더 유연해집니다.
- 주제와 옵저버 간의 개방-폐쇄 원칙을 따라 독립적인 확장과 재사용이 가능합니다.
- 주제가 다수의 옵저버를 가질 수 있는 일대다 종속성 관계를 설정할 수 있습니다.
3. Observer Pattern의 실제 응용 예
Observer Pattern은 GUI 인터페이스의 이벤트 처리 메커니즘, 주식 시세 실시간 푸시, 전자 상거래 플랫폼의 프로모션 활동 알림 등과 같이 현실에서 다양한 분야에서 활용됩니다.
4. Golang에서 Observer Pattern의 구현
4.1 UML 클래스 다이어그램
4.2 예제 소개
이 예제에서는 주제(Subject)와 두 개의 옵저버(ObserverA 및 ObserverB)가 있습니다. 주제는 옵저버를 등록, 제거 및 통지할 수 있습니다.
4.3 구현 단계
4.3.1 주제 인터페이스 및 구체적인 주제 클래스 생성
type Subject interface {
RegisterObserver(observer Observer)
RemoveObserver(observer Observer)
NotifyObservers()
}
type ConcreteSubject struct {
observers []Observer
}
// 리스너 객체 등록
func (subject *ConcreteSubject) RegisterObserver(observer Observer) {
subject.observers = append(subject.observers, observer)
}
// 리스너 객체 제거
func (subject *ConcreteSubject) RemoveObserver(observer Observer) {
for i, obs := range subject.observers {
if obs == observer {
subject.observers = append(subject.observers[:i], subject.observers[i+1:]...)
break
}
}
}
// 이벤트 통지
func (subject *ConcreteSubject) NotifyObservers() {
for _, observer := range subject.observers {
observer.Update()
}
}
4.3.2 옵저버 인터페이스 및 구체적인 옵저버 클래스 생성
type Observer interface {
Update()
}
type ConcreteObserverA struct {}
func (observer *ConcreteObserverA) Update() {
fmt.Println("옵저버 A가 통지를 받았습니다.")
}
type ConcreteObserverB struct {}
func (observer *ConcreteObserverB) Update() {
fmt.Println("옵저버 B가 통지를 받았습니다.")
}
4.4 예제 코드 데모
func main() {
subject := &ConcreteSubject{}
observerA := &ConcreteObserverA{}
observerB := &ConcreteObserverB{}
subject.RegisterObserver(observerA)
subject.RegisterObserver(observerB)
subject.NotifyObservers()
subject.RemoveObserver(observerA)
subject.NotifyObservers()
}
출력:
옵저버 A가 통지를 받았습니다.
옵저버 B가 통지를 받았습니다.
옵저버 B가 통지를 받았습니다.
위의 예제 코드는 Observer Pattern의 구체적인 구현을 보여줍니다. 주제(ConcreteSubject)가 두 개의 옵저버(ObserverA 및 ObserverB)를 등록하고, 그 두 옵저버에게 통지한 후에 옵저버 A가 주제에서 제거되고 옵저버 B에게 다시 통지되는 상황을 보여줍니다.