패턴을 하나씩 정리해 모으는 묶음이다. 각 편은 같은 뼈대를 쓴다 — 무엇인가 / 구조 / C++ 코드 / 언제 쓰나 / 대가 / 실제로 만나는 곳. 뼈대가 같아야 패턴끼리 비교가 된다.
구조 그림은 전부 다이어그램이고, C++ 예제는 모두 컴파일되고 실행되는 완결 프로그램이다. 돌려 보고 나온 출력을 그대로 싣는다.
두 갈래를 섞지 않는다
“디자인 패턴”으로 뭉뚱그리기 쉽지만 스코프가 다른 두 종류가 있다.
| 갈래 | 다루는 크기 | 예 |
|---|---|---|
| 아키텍처 패턴 | 시스템 전체의 배치 | 계층화, 클라이언트-서버, 파이프-필터 |
| 디자인 패턴(GoF 등) | 클래스·객체 몇 개 사이의 관계 | 커맨드, 전략, 반복자 |
섞어 두면 MVC와 싱글턴이 같은 층에 있는 것처럼 보인다. 실제로는 MVC가 애플리케이션 전체 배치를 정하는 것이고 싱글턴은 객체 하나의 생성 방식이라, 나란히 놓고 비교할 물건이 아니다.
아키텍처 패턴
시스템을 어떻게 배치할 것인가. 열 가지를 다룬다.
| 패턴 | 한 줄 |
|---|---|
| 계층화 | 책임을 층으로 쌓고 위에서 아래로만 부른다 |
| 클라이언트-서버 | 요청하는 쪽과 제공하는 쪽을 나눈다 |
| 마스터-슬레이브 | 하나가 일을 쪼개 여럿에게 시키고 결과를 모은다 |
| 파이프-필터 | 처리 단계를 줄로 잇고 데이터를 흘려보낸다 |
| 브로커 | 중개자가 요청을 알맞은 서버로 넘긴다 |
| 피어 투 피어 | 모든 참여자가 클라이언트이자 서버다 |
| 이벤트 버스 | 발행자와 구독자가 서로를 모른 채 버스로만 만난다 |
| 모델-뷰-컨트롤러 | 데이터·표현·입력처리를 셋으로 가른다 |
| 블랙보드 | 공용 저장소에 지식을 쌓아 가며 답에 접근한다 |
| 인터프리터 | 문법을 표현으로 만들어 해석해 실행한다 |
GoF 패턴과 람다
이쪽은 축이 따로 있다. 먼저 이 글을 읽는다.
멤버 함수가 하나뿐인 추상 인터페이스는
std::function으로 접힌다.
C++에서는 GoF 패턴 상당수가 정확히 그 모양이다 — 인터페이스 하나, 순수 가상 함수 하나, 그것을 구현한 클래스 여럿. 클래스 대신 값으로 다루면 계층이 통째로 사라진다.
다만 전부 접히지는 않는다. 그래서 접히는 정도가 서로 다른 넷을 골랐다.
| 패턴 | 접히는가 |
|---|---|
| Command | 통째로. 클래스 4 → 1 |
| Strategy | 통째로. 클래스 5 → 0 |
| Iterator | 접히지만 잃는 것이 있다 |
| Abstract Factory | 절반만. 공장은 접히고 물건은 안 접힌다 |
“람다가 항상 낫다”는 결론은 틀렸다. 각 편에 언제 접고 언제 접지 않는지를 같은 무게로 적었다.