본문 바로가기

GoF디자인패턴「구조편」

by Recstasy 2020. 12. 14.

디자인패턴 '구조'는 객체들의 '상호작용을 최대한 효율적으로 할 수 있는 방법'에 관한 방법이다.

 

패턴 설명 분야
어댑터
(ADAPTER)
·튜닝


*사용빈도 : ★★★★☆
*추천 : ★★★★★
*특징 : 작은 라이브러리 끼워맞추기에 유용함


어댑터 패턴은 랜선 원리와 비슷하다.


만일 랜선을 아래와 같이
한 가닥씩 복잡하게 연결해야 한다고 생각해보자.

랜선 연결하는 일이 꽤 복잡해질 것이다.
그래서 다음과 같은 아답터가 개발되었다.(아마도)

아답터 덕분에 랜선으로 라우터를 연결하는 일은
누구나 할 수 있게 되었다.

즉, 아답터 패턴을 활용한다면,
기존의 복잡한 인터페이스 명령어를
간단한 명령어로 변경할 수 있다.

가령, 위의 다이어그램에서,
Adaptee() 객체가 Target()클래스의 request1 ~ 100까지의 메서드를
실행해야하는 상황이라고 가정해보자.


``매번 request1 ~ 100까지 메서드를 실행할 것인가?
혹은
Adatee.specificRequest()메서드를 한번만 실행할 것인가?``


위와같이 Adapter클래스가 Target클래스를 상속받는다면,
Adaptee.specificRequest()요청이 들어왔을 때,
Adapter에서 Request1 ~100을 내부적으로 실행하면 된다.

사용자 입장에서는 specificRequest()를 한번만 실행했을 뿐이지만
실제 request1 ~ 100까지 실행된 것과 같다.
아답터가 중간에서 복잡한 기능을 내부적으로 실행했기 때문이다.

· 외부 라이브러리 이식
· 외부 라이브러리 수정

· 인터페이스 단순화작업
(GUI단순화)


브리지
(BRIDGE)
·이식

*사용빈도 : ★★★
*추천 : ★★★★
*특징 : 작은 라이브러리 끼워맞추기에 유용함


브리지 패턴은 어댑터의 연장선이다.


자바스크립트에서 여러 라이브러리를 사용한다면,
브리지 패턴은 상당히 유용하다.

아래와 같이 Adapter1~n(인터페이스)까지 만들어
필수적인 라이브러리들을 연결시켜주는 방식으로
완성형 어플을 쉽게 제작할 수 있다. 




자바스크립트 뿐만 아니라 모듈을 사용하는 언어들은
브리지 패턴이 아주 유용하며,
팩토리 메서드 패턴과 함께 사용할 때 더욱 강력하다. 




· 다수 라이브러리 연결
· 그래픽 어플제작
(그래픽 라이브러리 연결)

· 통화 시스템 구축
컴포지트
(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에서 구현한 기능만을 사용할 수 있다. 

프록시 패턴을 현실에 적용하면
수입차 매장이 대표적이다.



국내의 다임러 벤츠차량의 판매기업은 따로 있다.

고객이 구입하는 차량은 벤츠가 맞지만
고객은 중간 유통사를 통해서는
다임러 벤츠 본사의 판매정책에 관한 요구를 할 수 없다.



왜냐하면, 한국의 벤츠차량 유통사는
프록시 서버이기 때문이다.



· 채팅방 만들기
· 이미지 로더

· 웹소켓 라이브러리
· 가상화 기능

'코드 스터디' 카테고리의 다른 글

클린 아키텍처  (0) 2020.12.28
GoF 디자인 패턴「행위편」  (0) 2020.12.15
GoF디자인패턴「생성편」  (0) 2020.12.11
싱글톤 패턴  (0) 2020.12.10
커맨드 패턴  (0) 2020.12.09

댓글

최신글 전체

이미지
제목
글쓴이
등록일