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