C/C++ 디자인 패턴 (13) — 책임 연쇄(Chain of Responsibility)
HTTP 요청 하나를 처리하기 전에 차단 IP 확인, 인증, 정적 파일 응답, 애플리케이션 라우팅을 차례로 거쳐야 한다. 이를 함수 하나의 if-else로 늘어놓으면 단계를 추가하거나 순서를 바꿀 때마다 그 함수를 고쳐야…
HTTP 요청 하나를 처리하기 전에 차단 IP 확인, 인증, 정적 파일 응답, 애플리케이션 라우팅을 차례로 거쳐야 한다. 이를 함수 하나의 if-else로 늘어놓으면 단계를 추가하거나 순서를 바꿀 때마다 그 함수를 고쳐야…
수백 MB짜리 PDF를 목록에 띄울 때마다 전부 파싱하면 화면이 멈춘다. 일부 페이지는 관리자만 봐야 하고, 같은 페이지를 반복해서 읽는다면 결과를 재사용하고 싶다. 이런 요구를 문서 클래스 자체에 넣으면 본래 역할과…
문서 편집기의 글자 하나하나를 객체로 만들면 편하지만, 글자마다 글꼴 이름·크기·색을 들고 있으면 10만 글자짜리 문서가 수십 MB를 차지한다. 그런데 서식은 대부분 몇 가지뿐이고, 글자마다 다른 것은 위치 정도다. 플라이웨이트(Flyweight)는 객체의…
사진 썸네일 하나를 만들려면 파일을 읽고, 포맷에 맞게 디코딩하고, 비율을 유지하며 줄이고, JPEG로 인코딩해서 저장해야 한다. 이 다섯 단계를 화면마다 복사해 두면 순서나 품질 설정이 조금씩 달라지고, 하위 라이브러리를 바꿀…
데이터를 저장할 때 압축하고, 암호화하고, 바이트 수를 세는 기능을 필요에 따라 조합해 쓴다고 하자. 조합마다 서브클래스를 만들면 CompressedEncryptedCountingSink 같은 클래스가 끝없이 늘어나고, 조합 순서도 상속 구조에 고정된다. 데코레이터(Decorator)는 같은 인터페이스를…
디렉터리 크기를 구하려면 안에 든 파일 크기를 더하고, 하위 디렉터리가 있으면 그 안으로 다시 들어가야 한다. 파일과 디렉터리를 별개 타입으로 다루면 순회하는 코드마다 "이게 파일인가 디렉터리인가"를 분기해야 한다. 컴포지트(Composite)는 개별…
도형(원, 사각형)을 SVG와 ASCII 두 방식으로 그려야 한다고 하자. 상속으로 조합하면 SvgCircle, AsciiCircle, SvgRect, AsciiRect처럼 도형 수 × 렌더러 수만큼 클래스가 생기고, 렌더러 하나를 추가할 때마다 도형 수만큼 클래스를 또…
새로 설계한 코드는 온도를 섭씨 double로 다루는데, 가져다 써야 하는 외부 센서 라이브러리는 화씨 1/10도 정수를 돌려준다. 라이브러리는 고칠 수 없고, 우리 코드 곳곳에 단위 변환을 뿌릴 수도 없다. 어댑터(Adapter)는…
플러그인 레지스트리, 로거, 설정 저장소처럼 프로그램 전체에 딱 하나만 있어야 하고 어디서든 접근할 수 있어야 하는 객체가 있다. 전역 변수로 두면 누구나 새로 만들거나 덮어쓸 수 있다. 싱글톤(Singleton)은 클래스가 스스로…
문서 편집기에서 "선택한 객체 복제"를 구현한다고 하자. 선택된 것은 Document*로만 알고 있는데, 실제로는 Invoice일 수도 Memo일 수도 있다. 복사 생성자는 정적 타입을 알아야 호출할 수 있어서, 타입마다 if나 dynamic_cast를 늘어놓게…