코드 스터디
GoF디자인패턴「구조편」
Recstasy
2020. 12. 14. 06:21
디자인패턴 '구조'는 객체들의 '상호작용을 최대한 효율적으로 할 수 있는 방법'에 관한 방법이다.
패턴 | 설명 | 분야 |
어댑터 (ADAPTER) ·튜닝 |
*사용빈도 : ★★★★☆ *추천 : ★★★★★ *특징 : 작은 라이브러리 끼워맞추기에 유용함 어댑터 패턴은 랜선 원리와 비슷하다. 만일 랜선을 아래와 같이 한 가닥씩 복잡하게 연결해야 한다고 생각해보자. ![]() 랜선 연결하는 일이 꽤 복잡해질 것이다. ![]() 아답터 덕분에 랜선으로 라우터를 연결하는 일은 ![]() 가령, 위의 다이어그램에서, |
· 외부 라이브러리 이식 · 외부 라이브러리 수정 · 인터페이스 단순화작업 (GUI단순화) |
브리지 (BRIDGE) ·이식 |
*사용빈도 : ★★★☆☆ *추천 : ★★★★☆ *특징 : 작은 라이브러리 끼워맞추기에 유용함 브리지 패턴은 어댑터의 연장선이다. ![]()
![]() 자바스크립트 뿐만 아니라 모듈을 사용하는 언어들은 브리지 패턴이 아주 유용하며, 팩토리 메서드 패턴과 함께 사용할 때 더욱 강력하다. |
· 다수 라이브러리 연결 · 그래픽 어플제작 (그래픽 라이브러리 연결) · 통화 시스템 구축 |
컴포지트 (COMPOSITE) · 조합 [단일 결과물 도출] |
*사용빈도 : ★★★★☆ *추천 : ★★★★★ *특징 : 상속보다 유연함 컴포지트 패턴은 요리 레시피와 비슷하다. 재료를 있는 그대로 넣는 요리와 달리 피자와 같은 경우에는 손질한 재료를 조합한다. 일단 컴포지트 다이어그램 예시부터 살펴보자. ![]() 다이어그램은 다소 복잡해 보이지만 피자 요리법을 적용하면 꽤 간단하다. ![]() 다이어그램에서 오븐 부위에 해당하는 클래스(Leaf)는 반복적인 기능을 담고 있다. ![]() Leaf 클래스의 메서드에 공통으로 적용할 수 있는 기능을 담는다면 아래와 같이 피자 뿐만 아니라 바베큐도 가능하다. ![]() 컴포지트 패턴은 자바스크립트 개발에서 아주 유용하며, 자주 사용하는 패턴이다. |
· 최종 결과물 도출 · 파일 시스템 · 노드(트리구조) 생성 |
데커레이터 (DECORATOR) ·첨가 |
*사용빈도 : ★★★☆☆ *추천 : ★★★☆☆ *특징 : 객체가 다수 발생하는 상황을 통제할 수 있음 데커레이터 패턴은 스마트폰 케이스&필름과 같다. ![]() 스마트폰 유리액정필름이 금이 간다고해서 액정이 깨진 것은 아니다. 하지만 스마트폰 화면에 결정적인 영향을 준다. 액정필름과 케이스는 폰 자체 하드웨어가 아니지만 폰과 결합하는순간 폰 기능의 일부가 되고,(보호기능) 여러 기능을 추가할 수도 있다. 이렇게 메인 객체의 일부를 형성하며, 전체를 완성하는 방식이 데커레이터 패턴이다. 데커레이터 패턴은 컴포지트와 다이어그램이 같지만 치킨 바베큐로 표현하면 다음과 같은 차이점이 있다. ![]() 컴포지트는 여러 기능을 종합해서 1개의 결과물을 완성하지만 데커레이터(장식자) 패턴은 완성된 1개의 결과물과 장식품을 결합한다. |
· 상속이 제한적인 상황 · 댓글기능 추가 · 배너추가 · 쇼핑몰 이벤트 기능 · 이미지필터 기능 |
퍼사드 (FACADE) ·분리 |
*사용빈도 : ★★☆☆☆ *추천 : ★★★☆☆ *특징 : 객체가 다수 발생하는 상황을 통제할 수 있음 퍼사드 패턴은 버튼식 기어다. 자동차의 버튼식 기어와 수동기어의 차이점을 생각해보자. ![]() 수동기어는 '오토', '1종 보통' 적어도 최소 2가지 운전자 Type에 관한 책임을 갖는다. 또한 인터페이스가 있지만 사용자의 숙련도가 중요하다. 반면, 버튼식 오토 기어는 버튼을 선택하는 것만으로 사용자가 할 일은 없다. 사용자는 인터페이스에 의존하며, 각 기능은 정확하게 구분된다. 수동기어는 클래스 1개(기어봉)에서 1단~5단, 후진 기능을 모두 구현하는데 이와 같이 하나의 클래스가 너무 많은 책임을 갖게 되면 기능간의 병합이 발생하며, 사고 위험이 높아진다. 퍼사드는 책임을 분리하기 위한 패턴이다. ![]() |
· 관리자,사용자 분리 · 게시판 유저기능 분리 · 판매자,구매자 분리 · 제작,뷰어,판매 분리 |
플라이웨이트 (FLYWEIGHT) ·대량생산 |
*사용빈도 : ★★★★☆ *추천 : ★★★★☆ *특징 : 데이터 시각화에 유리함 플라이웨이트 패턴은 디지털카메라와 비슷하다. 필름카메라와 디지털카메라의 가장 큰 차이점이 무엇일까? 필름카메라를 다이어그램으로 표현하면 대략 아래와 같다. ![]() 필름카메라에서 이미지 양을 늘릴수록 필름의 양도 늘어난다. 만일, 1000장을 촬영해야 한다면, 필름을 갖고 다니기도 부담스럽다. 그래서 플라이웨이트 패턴이 등장했다. ![]() 플라이웨이트 패턴에서 FlyweightFactory클래스는 가상의 객체(프로토타입) Flyweight를 무한정 생산한다. FlyweightFactory인터페이스 클래스는 추상화 객체이므로 사진의 양에 크게 제한받지 않는다. ![]() 플라이웨이트 패턴으로 카메라 설계를 한다면, 위와같이 디지털카메라가 탄생하게 된다. |
· 3D게임환경 구축 · 워드S/W 문서꾸미기 · 포토샵 레이어복사 |
프록시 (PROXY) ·대리인 |
*사용빈도 : ★★★★★ *추천 : ★★★★☆ *특징 : 사용처 다수 프록시 패턴은 대리인이다. 웹서버 관련 용어로 프록시 서버를 접하는 경우가 많은데, 프록시 서버가 바로 프록시 패턴이다. ![]() 프록시 다이어그램에서 RealSubject, Proxy는 Subject기능을 상속받는다. 하지만 Proxy는 RealSubject에 의존하며, RealSubject에서 구현한 기능만을 사용할 수 있다. 프록시 패턴을 현실에 적용하면 수입차 매장이 대표적이다. ![]() 국내의 다임러 벤츠차량의 판매기업은 따로 있다. 고객이 구입하는 차량은 벤츠가 맞지만 고객은 중간 유통사를 통해서는 다임러 벤츠 본사의 판매정책에 관한 요구를 할 수 없다. ![]() 왜냐하면, 한국의 벤츠차량 유통사는 프록시 서버이기 때문이다. |
· 채팅방 만들기 · 이미지 로더 · 웹소켓 라이브러리 · 가상화 기능 |