구조 패턴 (Structural Pattern)

1. 인터페이스 호환성 제공, Adapter 패턴

(1) Adapter 패턴의 개념 및 사용 목적

개념사용 목적
호환되지 않은 인터페이스를 가진 객체 간 클래스 상속과 인스턴스 위임을 통해 인터페이스 호환성을 제공하는 구조적 디자인 패턴 – 서로 다른 인터페이스 간 호환성 제공
– 프로그램 신/구버전 공존 가능성 제공

(2) Adapter 패턴의 클래스 다이어그램

상속
위임

(3) Adapter 패턴의 구성요소

구성요소역할
Target수행 시 필요한 메소드를 결정
ClientTarget의 메소드를 사용
Adaptee적응 대상으로 이미 준비된 메소드를 가짐
AdapterAdaptee의 메소드를 사용하여 Target을 만족시키는 것이 목적

 

2. 기능 계층과 구현 계층 분리, Bridge 패턴

(1) Bridge 패턴의 개념 및 사용 목적

개념사용 목적
객체의 확장성과 다양성을 확보하기 위해 객체에서 기능 부분과 구현 부분을 분리하여 연결해주는 구조적 디자인 패턴– 기능/구현의 클래스를 분리
– 기능/구현 클래스 간 연결

(2) Bridge 패턴의 클래스 다이어그램

(3) Bridge 패턴의 구성요소

구성요소역할
Abstraction기능의 클래스 계층의 최상위 클래스로 Implementor의 메소드를 사용하여 기본 기능만 기술
RefinedAbstractionAbstraction에 기능을 추가
Implementor구현의 클래스 계층의 최상위 클래스로 Abstraction의 인터페이스를 구현하기 위한 메소드를 규정
ConcreteImplementor구체적으로 Implementor의 인터페이스를 구현

 

3. 단일/복합 객체 동일 취급, Composite 패턴

(1) Composite 패턴의 개념 및 사용 목적

개념사용 목적
단일/복합 객체를 동일하게 취급하기 위해 객체들 관계를 트리 구조로 구성하여 부분-전체 계층을 표현하는 구조적 디자인 패턴– 단일/복합 객체를 동일하게 취급
– 부분과 전체 계층을 재귀적으로 표현

(2) Composite 패턴의 클래스 다이어그램

(3) Composite 패턴의 구성요소

구성요소역할
LeafComponent 인터페이스를 구현
CompositeLeaf나 Composite를 보유
ComponentLeaf와 Composite를 동일하게 취급하고 공통 상위 클래스로 구현

 

4. 코드 변경 없이 기능 추가, Decorator 패턴

(1) Decorator 패턴의 개념 및 사용 목적

개념사용 목적
기존 코드를 변경하지 않고 부가 기능을 동적으로 유연하게 추가하기 위해  특수 래퍼(wrapper) 객체 안에 객체를 배치하는 구조적 디자인 패턴– 객체에 추가 요건을 기능을 동적으로 추가
– 기존 코드 변경 없이 다양한 기능 추가

(2) Decorator 패턴의 클래스 다이어그램

(3) Decorator 패턴의 구성요소

구성요소역할
ComponentConcreteComponent와 Decorator가 구현할 인터페이스로, 두 객체를 동등하게 취급
ConcreteComponentDecorate(기능 추가) 대상 객체
DecoratorDecorate 할 객체의 추상 클래스로, 기능 추가 대상 객체는 이 객체를 상속
ConcreteDecoratorDecorate를 상속받아 구현할 기능 객체

 

5. 단순한 인터페이스 제공, Façade 패턴

(1) Façade 패턴의 개념 및 사용 목적

개념사용 목적
 복잡한 코드를 단순한 인터페이스로 제공하기 위해 공통 기능을 정의하는 단순화된 상위 수준의 인터페이스를 정의하는 구조적 디자인 패턴– 복잡한 내용을 상위 수준의 API로 제공
– 시스템 외부에 간단한 인터페이스 제공
– 클래스 역할을 고려하여 올바른 순서 사용

(2) Façade 패턴의 클래스 다이어그램

(3) Façade 패턴의 구성요소

구성요소역할
Facade시스템을 구성하는 클래스의 창구 역할로, 상위 수준의 단순한 인터페이스를 시스템 외부에 제공
여러 Class각 Class 별 기능을 제공하며, Facade에서 호출되어 수행

 

6. 기존 객체 공유로 가벼운 시스템 유지, Flyweight 패턴

(1) Flyweight 패턴의 개념 및 사용 목적

개념사용 목적
메모리 사용 효율화를 위해 재사용 가능한 객체 인스턴스를 공유(캐싱)하여 new 연산자 사용을 최소화하는 구조적 디자인 패턴– 인스턴스 최대한 공유, new 최소화
– 메모리 사용 효율화로 성능 향상

(2) Flyweight 패턴의 클래스 다이어그램

(3) Flyweight 패턴의 구성요소

구성요소역할
FlyweightFlyweight 공통 메소드를 정의하고 Factory에 제공
FlyweightFactory해당 클래스를 사용하여 Flyweight의 인스턴스를 생성 또는 공유(캐싱)
ConcreteFlyweightFlyweight의 구체적인 기능을 구현하고 실제 사용되는 객체

 

7. 원본 객체 대신 처리, Proxy 패턴

(1) Proxy 패턴의 개념 및 사용 목적

개념사용 목적
객체의 접근제어 및 보안성 향상을 위해 원본 객체를 대리하여 대신 처리하게 함으로써 로직의 흐름을 제어하는 구조적 디자인 패턴– 객체의 유효성 검사, 보안성 향상
– 가상 프록시, 원격 프록시, 보호 프록시

(2) Proxy 패턴의 클래스 다이어그램

(3) Proxy 패턴의 구성요소

구성요소역할
SubjectProxy와 RealSubject를 동일시하기 위한 인터페이스 정의
Proxy대상 객체인 RealSubject를 대신하여 사용자 요청 처리
RealSubject실제 서비스하는 주 객체로 원본 대상 객체

 
[참고]

  • 영진닷컴, JAVA 언어로 배우는 디자인 패턴 입문: 쉽게 배우는 GoF의 23가지 디자인 패턴

콘텐츠 사용 시 출처 표기 부탁 드리고, 댓글은 큰 힘이 됩니다^^