패턴을 하나씩 정리해 모으는 묶음이다. 각 편은 같은 뼈대를 쓴다 — 무엇인가 / 구조 / C++ 코드 / 언제 쓰나 / 대가 / 실제로 만나는 곳. 뼈대가 같아야 패턴끼리 비교가 된다.

구조 그림은 전부 다이어그램이고, C++ 예제는 모두 컴파일되고 실행되는 완결 프로그램이다. 돌려 보고 나온 출력을 그대로 싣는다.

두 갈래를 섞지 않는다

“디자인 패턴”으로 뭉뚱그리기 쉽지만 스코프가 다른 두 종류가 있다.

갈래다루는 크기
아키텍처 패턴시스템 전체의 배치계층화, 클라이언트-서버, 파이프-필터
디자인 패턴(GoF 등)클래스·객체 몇 개 사이의 관계커맨드, 전략, 반복자

섞어 두면 MVC와 싱글턴이 같은 층에 있는 것처럼 보인다. 실제로는 MVC가 애플리케이션 전체 배치를 정하는 것이고 싱글턴은 객체 하나의 생성 방식이라, 나란히 놓고 비교할 물건이 아니다.

아키텍처 패턴

시스템을 어떻게 배치할 것인가. 열 가지를 다룬다.

패턴한 줄
계층화책임을 층으로 쌓고 위에서 아래로만 부른다
클라이언트-서버요청하는 쪽과 제공하는 쪽을 나눈다
마스터-슬레이브하나가 일을 쪼개 여럿에게 시키고 결과를 모은다
파이프-필터처리 단계를 줄로 잇고 데이터를 흘려보낸다
브로커중개자가 요청을 알맞은 서버로 넘긴다
피어 투 피어모든 참여자가 클라이언트이자 서버다
이벤트 버스발행자와 구독자가 서로를 모른 채 버스로만 만난다
모델-뷰-컨트롤러데이터·표현·입력처리를 셋으로 가른다
블랙보드공용 저장소에 지식을 쌓아 가며 답에 접근한다
인터프리터문법을 표현으로 만들어 해석해 실행한다

GoF 패턴과 람다

이쪽은 축이 따로 있다. 먼저 이 글을 읽는다.

멤버 함수가 하나뿐인 추상 인터페이스는 std::function으로 접힌다.

C++에서는 GoF 패턴 상당수가 정확히 그 모양이다 — 인터페이스 하나, 순수 가상 함수 하나, 그것을 구현한 클래스 여럿. 클래스 대신 값으로 다루면 계층이 통째로 사라진다.

다만 전부 접히지는 않는다. 그래서 접히는 정도가 서로 다른 넷을 골랐다.

패턴접히는가
Command통째로. 클래스 4 → 1
Strategy통째로. 클래스 5 → 0
Iterator접히지만 잃는 것이 있다
Abstract Factory절반만. 공장은 접히고 물건은 안 접힌다

“람다가 항상 낫다”는 결론은 틀렸다. 각 편에 언제 접고 언제 접지 않는지를 같은 무게로 적었다.