독서 기록/디자인패턴

[디자인패턴] 헤드퍼스트 디자인패턴 Chap.2 (Feat.옵저버 패턴)

JoJobum 2022. 9. 23.
public class WeatherData{
	// 현재 기상 상황 갱신하는 메서드 
	public void measurementsChanged(){
    	
        // 최신값 불러옴
    	float temp = getTemperature();
        float humidity = getHumidity();
        float pressure = getPressure();
        
        // 변화한 값 각 디스플레이에 갱신
        display1.update(temp,humidity, pressure);
        display2.update(temp,humidity, pressure);
        display3.update(temp,humidity, pressure);
    }
}

위의 코드에는 아래 같은 문제가 발생 

  • 인터페이스가 아닌 구체적인 구현을 바탕으로 함
  • 새로운 디스플레이 생기면 코드 변경 생김
  • 실행 중에 디스플레이 구성 변경 불가
  • 바뀌는 부분 캡슐화 되지 않음

이러한 문제점을 해결하기 위해 옵저버 패턴을 도입

 

옵저버 패턴이란?

 

주제(subject)와 옵저버(observer)로 구분

위의 경우 Weather 이라는 주제에 Display라는 옵저버로 구성

 

주제에서는 중요한 데이터를 관리하고, 변경시 옵저버들에게 이를 전달

반대로 옵저버들은 주제를 구독하고 있다면 주제에 대한 소식을 전달 받고, 그렇지 않다면 변경사항 X

 

다시 정리하면,

한 객체의 상태가 바뀌면 그 객체에 의존하는 다른 객체에게 연락이 가고 자동으로 내용이 갱신되는 방식으로 일대다(one to many) 의존성

 

 

옵저버 패턴을 사용하는 경우

  • 1개 이상의 객체들의 상태의 변화를 알리거나, 이를 트리거로 다른 객체에게 변화를 주어야 할 때
  • 느슨한 결합이 필요할 때
     

 

느슨한 결합(Loose Coupling)

객체들이 상호작용할 수는 있지만, 서로를 잘 모르는 관계를 의미

결합이 밀접하다면 유연성이 떨어질 것, 반대로 느슨한 결합을 활용하면 유연성이 좋아짐.

위의 옵저버 패턴이 느슨한 결합의 예시

  • 주제는 옵저버가 특정 옵저버 인터페이스를 구현한다는 것만 암
  • 옵저버는 언제든지 추가 가능
  • 새로운 형식의 옵저버를 추가해도 주제 변경 필요 없음, 옵저버로 등록만 하면 된다
  • 주제와 옵저버는 서로 독립적으로 재사용 가능
  • 주제와 옵저버가 서로 달라져도 영향 주지 않음

 

느슨한 결합을 사용하면 변경사항이 생겨도 무난히 처리할 수 있는 유연한 객체 지향 시스템을 구축할 수 있음

이러한 장점 때문에

디자인 원칙 : 상호작용하는 객체 사이에는 가능하면 느슨한 결합을 사용해야 한다.

 

 

옵저버와 주제간의 데이터를 주고 받는 방식은 2가지

  • 주제가 옵저버에게 상태를 알리는 방식 (== 푸시)
  • 옵저버가 주제로부터 상태를 끌어오는 방식(== 풀) 

이를 선택하는 일은 구현 방법의 문제, 일반적으로는 풀 방식이 더 좋음

 

 

정리

 

달라지는 부분과 아닌 부분 분리

옵저버 패턴에서 변하는 것은 주제의 상태와 옵저버의 개수, 형식

주제를 바꾸지 않고도 주제의 상태에 의존하는 객체들을 바꿀 수 있음 

 

구현보다 인터페이스에 맞추기

주제와 옵저버 모두 인터페이스 사용, 주제 인터페이스로 옵저버 인터페이스를 구현하는 객체들의 등록과 탈퇴 관리 + 상태 알림 => 느슨한 결합 만듬

 

상속보다는 구성

옵저버 패턴에서는 구성을 활용, 주제와 옵저버 사이의 관계는 구성 

 

반응형

댓글