클래스와 객체를 조합해 더 큰 구조를 만드는 패턴들. 맞지 않는 인터페이스, 부분과 전체, 기능 덧붙이기, 접근 제어 같은 문제를 다룬다. 상당수가 "같은 인터페이스를 가진 객체로 감싼다"는 같은 모양을 하고 있고, 감싸는 목적이 다르다.
- 어댑터 패턴: 맞지 않는 인터페이스를 기대하는 모양으로 바꾼다
- 데코레이터 패턴: 감싸서 기능을 겹겹이 덧붙인다
- 퍼사드 패턴: 복잡한 하위 시스템 앞에 단순한 창구를 세운다
- 컴포지트 패턴: 개별 객체와 묶음을 같은 방식으로 다룬다
- 프록시(Proxy): 같은 인터페이스로 실제 객체 앞에서 접근을 가로채 권한 확인·지연 로딩·캐싱을 한다. 스프링이 대표적인 사용처다(스프링 프록시)
- 브리지(Bridge): 기능 축과 구현 축이 함께 상속 계층을 폭발시킬 때(리모컨 종류 × 기기 종류), 추상 쪽이 구현 객체를 참조해 위임하게 해서 두 축을 따로 확장한다. 축이 실제로 독립적이지 않으면 추상화만 복잡해진다
- 플라이웨이트(Flyweight): 비슷한 객체가 대량으로 생길 때 공통 내부 상태를 공유하고, 바뀌는 외부 상태만 따로 넘겨 메모리를 줄인다(텍스트 렌더링의 글자 모양 데이터). 메모리가 실제 병목인지 측정한 뒤 쓴다
감싸는 패턴들을 구분하는 법: 인터페이스를 바꾸면 어댑터, 그대로 두고 기능을 더하면 데코레이터, 그대로 두고 접근을 통제하면 프록시, 여럿을 하나로 단순화하면 퍼사드다.