Skip to content

Commit add5e7a

Browse files
authored
Docs: 박승훈 7장-3 (#65)
1 parent cd95c7e commit add5e7a

File tree

1 file changed

+168
-1
lines changed

1 file changed

+168
-1
lines changed

챕터_7/박승훈.md

Lines changed: 168 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -838,4 +838,171 @@ console.log(decoratedMacBook.getPrice()); // 945
838838

839839
### 나의 생각
840840

841-
위에서 언급되었던 그냥 decorator 패턴보다는 제 의문을 해결하는 방식인 것 같아요. 잘 이해해서 실무에 활용해보면 좋을 것 같아요.
841+
위에서 언급되었던 그냥 decorator 패턴보다는 제 의문을 해결하는 방식인 것 같아요. 잘 이해해서 실무에 활용해보면 좋을 것 같아요.
842+
843+
844+
845+
## 행위 패턴
846+
847+
> 객체 간의 의사소통을 돕는 패턴
848+
849+
- 시스템 내 서로 다른 객체 간의 의사소통 방식을 개선하고 간소화하는 것이 목적
850+
- 관찰자, 중재자, 커맨드 패턴이 있다.
851+
852+
853+
## 관찰자 패턴
854+
855+
> 한 객체가 변경될 때 다른 객체들에 변경되었음을 알릴 수 있게 해주는 패턴
856+
857+
- 한 객체(주체)를 관찰하는 여러 객체들(관찰자)이 존재
858+
- 주체의 상태가 변화하면 관찰자들에게 자동으로 알림 전송
859+
860+
861+
### 관찰자 패턴의 구성요소
862+
863+
- 주체(Subject): 관찰자 리스트를 관리하고, 추가 삭제 가능케 한다.
864+
- 관찰자(Observer): 주체의 상태 변화를 감지하는 update 인터페이스 제공
865+
- 구체적 주체(ConcreteSubject)
866+
- 상태변화에 대한 알림을 모든 관찰자에게 전달
867+
- 구체적 관찰자의 상태 저장
868+
- 구체적 관찰자(ConcreteObserver)
869+
- 구체적 주체의 참조 저장
870+
- 관찰자의 update 인터페이스를 구현
871+
- 주체의 상태 변화와 관찰자의 상태 변화가 일치할 수 있도록 구현
872+
873+
874+
### 발행/구독 패턴과의 차이점
875+
876+
#### 관찰자 패턴
877+
878+
- 이벤트 발생에 대해 알림 받기를 원하는 관찰자 객체가 이벤트를 발생시키는 주체 객체에 알림 대상으로서 등록되어야 한다.
879+
880+
881+
#### 발행/구독 패턴
882+
883+
- 이벤트 소스를 하나의 객체로 보내는 방법(이벤트 집합)
884+
- 이벤트 알림을 원하는 구독자와 이벤트를 발생시키는 발행자 사이에 토픽/이벤트 채널을 둔다.
885+
- **발행자와 구독자를 각자 독립적으로 유지**한다는 것이 핵심
886+
- 즉, **시스템의 구성 요소 간에 느슨한 결합을 도모**한다는 것이 핵심
887+
- 적절한 이벤트 핸들러를 가지고 있는 구독자라면 누구나 발행자가 전파하는 토픽의 알림을 받게 할 수 있다.
888+
889+
890+
891+
### 장점
892+
893+
- 앱의 여러 구성 요소 간의 관계를 심도 있게 고민해 볼 수 있는 기회 마련
894+
- 각각의 요소들이 직접 연결되어 있는 곳을 파악
895+
- 주체와 관찰자의 관계로 대체할 수 있는 부분을 찾아낼 수 있도록 도움
896+
- **앱을 더 작고 느슨하게 연결된 부분으로 나눌 수 있다.**
897+
- **코드의 관리와 재사용성을 높일 수 있다.**
898+
899+
900+
### 또다른 장점
901+
902+
- 클래스를 강하게 결합시키지 않으면서 관련 객체들 사이의 일관성을 유지
903+
- 주체와 객체 사이에 동적인 관계 형성
904+
- 앱의 여러 부분이 강하게 결합되어 있을 때 구현하기 까다로운 뛰어난 유연성 쉽게 구현 가능
905+
906+
907+
### 단점
908+
909+
- 발행자와 구독자의 연결을 분리함으로써, 앱의 특정 부분들이 기대하는 대로 동작하고 있다는 것을 보장하기 어렵다.
910+
- 발행자는 발행을 할 뿐, 구독자가 어떤 일을 하는지 모르기 때문
911+
- 구독자들 역시 서로의 존재에 대해 전혀 알 수 없다.
912+
- 발행자를 변경하는 비용을 파악하기 어렵다.
913+
- 어떤 구독자가 어떤 발행자에 의존하는지 추적이 어렵다.
914+
915+
916+
## 중재자 패턴(Mediator Pattern)
917+
918+
> 하나의 객체가 이벤트 발생 시 다른 여러 객체들에게 알림을 보낼 수 있는 패턴
919+
920+
921+
### 관찰자 패턴과의 차이
922+
923+
- 중재자 : 하나의 객체가 다른 객체에서 발생한 특정 유형의 이벤트에 대해 알림을 받을 수 있다.
924+
- 관찰자 : 하나의 객체가 다른 객체에서 발생하는 다수의 이벤트를 구독할 수 있도록 한다.
925+
926+
927+
### 중재자의 정의
928+
929+
- 여러 객체 간의 상호작용(로직과 행동)을 조율하는 객체
930+
- 다른 객체들의 행동과 입력에 따라 언제 어느 객체를 호출할지 결정
931+
- 객체 간의 워크플로우 제어
932+
933+
934+
### 이벤트 집합 패턴과의 차이
935+
936+
- 유사점 : '이벤트'와 '서드 파티 객체'라는 두 가지 핵심 요소
937+
938+
- 이벤트를 다루는가?
939+
- 이벤트 집합 : 이름처럼 명백하다.
940+
- 중재자 패턴 : 꼭 이벤트를 다룰 필요는 없다.
941+
- 이벤트를 왜 사용하는가?
942+
- 이벤트 집합 : 이벤트 처리 그 자체를 위해 설계된 패턴
943+
- 중재자 패턴 : 단순히 편리하기 때문에
944+
- 서브파티 객체
945+
- 둘다 상호작용을 간소하기 위해 서브 파티 객체 사용
946+
- 애플리케이션 로직과 워크플로우가 어디에 구현되어 있는지가 관건
947+
- 이벤트 집합 : 모든 이벤트가 통과하는 중앙 허브 역할 / 알 수 없는 수의 소스에서 알 수 없는 수의 핸들러로 이벤트가 연결되도록 지원하는 역할만 한다. 실행되는 모든 워크 플로우와 비즈니스 로직은 이벤트를 발생시키는 소스와 이벤트를 처리하는 핸들러에 직접 구현
948+
- 중재자 패턴 : 비즈니스 로직과 워킆플로우가 중재자 객체 내부에 집중. 자신이 보유한 정보를 바탕으로 각 객체의 메서드 호출 시점과 속성 업데이트의 필요성을 판단. 워크플로우의 각 객체는 각자의 역할을 수행하는 방법을 알고 있지만, 중재자는 보다 거시적 차원에서의 결정을 통해 객체들에게 적절한 작업 시기를 안내
949+
950+
951+
### 패턴의 활용
952+
953+
#### 이벤트 집합의 활용
954+
955+
직접적인 구독 관계가 많아질 경우, 또는 전혀 관련 없는 객체들 간의 소통이 필요할 때 사용
956+
957+
958+
#### 중재자 패턴의 활용
959+
960+
- 두 개 이상의 객체가 간접적인 관계를 가지고 있는 경우
961+
- 비즈니스 로직이나 워크플로우에 따라 상호작용 및 조정이 필요한 경우
962+
- 마법사 형식의 인터페이스가 대표적 예시
963+
- 구현 세부사항에서 워크 플로우를 추출함으로써 보다 상위 레벨에서 워크플로우를 자연스럽게 추상화
964+
965+
966+
#### 워크플로우의 차이
967+
968+
- 이벤트 집합 : 메뉴와 워크플로우 사이의 명확한 분리 구현 가능
969+
- 중재자 패턴 : 워크플로우의 관리 및 유지보수성 강화
970+
971+
972+
### 퍼사드 패턴과의 차이
973+
974+
#### 중재자 패턴
975+
976+
- 모듈이 명시적으로 중재자를 참조
977+
- 모듈 간의 상호작용을 중앙집중화
978+
- 본질적으로 다방향성
979+
980+
981+
#### 퍼사드 패턴
982+
983+
- 모듈 또는 시스템에 직관적인 인터페이스를 제공
984+
- 하지만, 추가 기능을 구현하지 않는다.
985+
- 시스템 내 다른 모듈은 퍼사드의 개념을 직접적으로 인지하지 못한다.
986+
- 그래서 단방향성
987+
988+
989+
## 커맨드 패턴
990+
991+
> 메서드 호출, 요청, 또는 작업을 단일 객체로 캡슐화하여 추후에 실행
992+
993+
- 실행 시점을 유연하게 조정 가능
994+
- 호출을 매개변수화 가능
995+
- 명령을 실행하는 객체와 명령을 호출하는 객체 간의 결합을 느슨하게
996+
- 구체적인 클래스(객체)의 변경에 대한 유연성 향상
997+
998+
999+
### 커맨드 패턴의 기본 원칙
1000+
1001+
> 명령을 내리는 객체와 명령을 실행하는 객체의 책임을 분리한다.
1002+
1003+
책임을 다른 객체에 위임함으로써 역할 분리를 실현한다.
1004+
1005+
1006+
### 장점
1007+
1008+
> 인터페이스가 동일한 모든 커맨드 객체를 쉽게 교체할 수 있다.

0 commit comments

Comments
 (0)