제 블로그의 모든 글은 IMHO로 쓴 것입니다. 잘못된 부분이 있으면 덧글을 통해서 소통을 하면 더 좋은 글로 발전이 될 수 있을 것 같습니다. 그렇지만 소통을 할 때 서로의 감정을 존중하는 선에서 해주셨으면 좋겠습니다. 감사합니다:)
옵저버 패턴이란?
서로의 정보를 넘기고 받는 과정에서 정보의 단위가 클 수록, 객체들의 규모다 클 수록, 각 객체들의 관계가 복잡할 수록 점점 구현하기 어려워지고 복잡성이 매우 증가할 것이다. 이러한 기능을 할 수 있도록 가이드라인 을 제시해 주는 것
옵저버 패턴사용할 상황은?
- 객체들 사이에서 다양한 처리를 할 경우가 많다.
- 한 객체의 상태가 바뀔 경우 다른 객체들에게 변경됐다고 알려줘야한다.
- 서로의 정보를 넘기고 받는 과정에서 정보의 단위가 클 수록, 객체들의 규모다 클 수록, 각 객체들의 관계가 복잡할 수록 점점 구현하기 어려워지고 복잡성이 매우 증가할 것이다.
- 그래서 상태를 가지고 있는 주체 객체와 상태의 변경을 알아야 하는 관찰 객체(Observer Object)를 만든다.
-
이들의 관계는 1:1이 될 수도 있고 1:N이 될 수가 있다.
- 해결책은 가이드라인을 제시(feat. 옵저버 패턴)
실생활 예제
잡지를 발행하는 잡지사와 그 잡지를 매달 구독하는 독자들과의 관계,
- (계약) : 잡지의 정보들을 알고자 하는 고객들은 잡지사에 구독을 신청하고 꾸준히 정보를 얻어간다.
- (계약 해지) : 잡지를 구독하다가 더 이상 잡지를 원하지 않을 경우 관계를 끊는다.
subscribe와 observer는 비슷하다.
옵저버 패턴은 주제와 옵저버가 느슨하게 결합(loose coupling)되어있는 객체 디자인을 제공.
주제가 옵저버에 대해서 아는 것은 옵저버가 특정 인터페이스(Observer 인터페이스)를 구현 한다는 것 뿐. 옵저버는 언제든지 새로 추가할 수 있음. (주제는 Observer인터페이스 구현하는 객체 목록에만 의존하기때문) 새로운 형식의 옵저버를 추가하려해도 주제를 전혀 변경할 필요가 없음. (새로운 클래스에서 Observer 인터페이스만 구현해주면됨) 주제나 옵저버가 바뀌더라도 서로에게 전혀 영향을 주지않음. 그래서 주제와 옵저버는 서로 독립적으로 재 사용할수 있음.
구현 보여주는 link https://futurecreator.github.io/2018/06/04/java-observer-pattern/
loose coupling and high cohesion
모듈(Module)
응집도와 결합도는 프로그램의 모듈과 모듈간의 관의 관계에 대한 개념이다. 따라서 프로그램에 있어서 모듈의 개념을 이해하는 것이 먼저이다. 모듈은 프로그램에서 하나의 기능을 수행하는 단위 프로그램의 기능을 독립적인 부품으로 분리한 것이 모듈
응집도(Cohesion)
한 모듈 내에 존재하는 함수, 데이터 등의 구성 요소들 사이의 밀접한 정도를 나타낸다. 응집도가 높은 모듈은 하나의 모듈 안에 필요한 함수나 데이터와 같은 구성 요소들이 똘똘 뭉쳐서 존재한다. 반대로 응집도가 낮은 모듈은 모듈 내부에 서로 관련 없는 함수나 데이터들이 존재하거나 관련성이 적은 여러 기능들이 하나의 모듈 안에 있게된다. -> feat. 함수형 프로그래밍 응집도는 정보 은닉과도 관계가 있으며, 응집도가 높은 모듈은 프로그램 전체에서 담당하는 기능을 수행하는 것에 있어서는 다른 모듈과의 상호작용이 거의 없이도 단일 기능을 수행할 수 있게된다.
결합도(Coupling)
결합도는 하나의 모듈이 다른 모듈에 의존하는 정도를 나타낸다. 결합도를 의존도라고 부르기도 한다. 완제품 자동차 하나에는 여러 개의 모듈들(핸들, 엔진, 배터리 등)이 들어 있는 것처럼 하나의 프로그램에는 많은 모듈들이 존재한다. 결합도는 이렇게 하나의 프로그램 안에서 각 모듈들이 서로 관련되어 의존하고 있는 정도를 뜻한다. 각 모듈이 서로 관련성이 적어 결합도가 낮을수록 모듈간의 독립성이 높아진다. 독립성이 높은 모듈은 서로의 기능에 영향을 미치지 않고 데이터만을 주고받는다. 때문에 전체 프로그램에서 일부 기능을 수정해야 할 때 그 기능을 담당하는 모듈만을 교체하면 되기 때문에 유지보수가 손쉽다. 자동차의 예에서 핸들을 교체하는데 엔진의 일부분이 관계가 있어서 엔진까지 같이 손봐야 한다면 이는 결합도가 높은 상태인 것이다. 결합도가 낮아 모듈간의 독립성이 높아지게끔 설계 하는 것이 좋은 설계라고 할 수 있을 것이다.
loose coupling and high cohesion
응집도는 높을수록 좋고 결합도는 낮을 수록 좋다는 “high cohesion loose coupling” 원칙이 항상 유효한 것은 아니다. 프로그램의 특성이나 상황에 따라 유연하게 적용해야 할 것이다. 하지만 시스템 유지보수 측면에 있어서 모듈의 응집도는 높을수록, 결합도는 낮을 수록 유리한 것은 분명하다.
출처: https://flowarc.tistory.com/entry/디자인-패턴-옵저버-패턴Observer-Pattern [Jamin’s Dev log]