본문 바로가기

Programming

Programming/SoftwareArchitecture/디자인 패턴 - 기본

반응형
출처 : 코드, 패턴 그리고 소프트웨어(지은이 포인트) - https://wikidocs.net/book/55

# 디자인 패턴
 - 방식을 통해 소프트웨어 설계에서 얻은 세세한 경험들을 기록해 놓도록 하는 것
  • 패턴 "어떤 상황의 문제에 대한 해법"
    • 패턴의 4가지 요소
      • 이름 (pattern name) 
        • " 한 두단어로 설계 문제와 해법을 서술"
        • 설계 어휘를 늘리는 일
        • 추상화된 설계 가능
        • 설계 의도 표현
        • 개발자 간의 의사소통 도움
      • 문제 (problem)
        • "언제 패턴을 사용하는 가를 서술하며 해결할 문제와 그 배경을 설명"
        • 설계의 세밀한 문제
      • 해법 (solution)
        • "설계를 구성하는 요소들과 그 요소들 간의 관계 책임 그리고 협력 관계를 서술"
        • 패턴은 다양한 경우에 적용할 수 있는 템플릿(template)이기 떄문에, 구체적인 설계나 구현을 해법에서 제시하지 않는다.
        • 추상적인 설명을 제공하며, 클래스나 객체들의 나열 방법을 제공
      • 결과 (consequence) 
        • "패턴을 적용해서 얻는 결과와 장단점을 서술"
        • 비용과 효과를 측정하는 과정에서 설계의 결과를 고려
        • 소프트웨어에서 결과란 시간이나 공간사이의 균형을 의미
          • 시간복잡도와 공간복잡도
        • 시간 vs 공간 에 따라서 설계 방법을 채택
          • 재사용 - 객체 지향 설계의 주요 요소
        • 패턴의 결과
          • 시스템의 유연성, 확장성, 이식성에 큰 영향.
  • 그렇다면 디자인 패턴이란 ? - "특정한 전후 관계에서 일반적 설계 문제를 해결하기 위해 상호 교류하는 수정 가능한 객체와 클래스들에 대한 설명"

# 디자인 패턴 이름의 분류
- 패턴의 생명이자 핵심을 간결하게 전달하는 부분.
  • 의도(Intent) : 이 디자인 패턴은 무엇을 하는 가? 의도와 논리적인 근거가 무엇인가? 어떤 특정한 문제나 이슈를 해결하기 위한 것일까요? 라는 질문에 간결한 답을 제시하는 부분이다.
  • 다른 이름(Also Known As) : 이 패턴을 다르게 부르는 이름이 있다면 그것을 제시 한다.
  • 동기(Motivation) : 설계 문제를 제시하고, 패턴안에서 클래스나 객체 구조가 어떻게 문제를 해결하는 지 설명해주는 일종의 시나리오 이 시나리오는 패턴에 대한 좀 더 추상화된 설명을 이해할 수 있게 도와 준다.
  • 활용성(Applicability) : 해당 패턴을 어떤 상황에 적용할 수 있을까? 패턴이 문제로 삼는 잘못된 설계에는 무엇일까? 이 상황을 어떻게 파악할 수 있을까?
  • 구조(Structure) : 객체 모델링 기법(Object Modeling Technique)1에 기반을 둔 표기법을 이용하여 해당 패턴에서 쓰는 클래스들을 시각적으로 나타낸다 또한 객체 사이에 오가는 요청과 협력 관계의 순차를 표현하기 위해서 상호작용 다이어그램을 사용했다.
  • 참여자(Participant) : 주어진 패턴을 구성하고 책임을 수행하는 클래스나 객체들을 설명한다.
  • 협력방법(Collaboration) : 참여자들이 작업을 수행하기 위한 참여자들 간의 협력관계를 정의한다.
  • 결과(Consequence) : 이 패턴이 자신의 목표를 어떻게 지원할까? 이 패턴을 이용한 결과는 무엇이고 장단점은 무엇?
  • 이 패턴을 사용하면 시스템 구조의 어떤 면을 독립적으로 다양화 시킬수 있을까?
  • 구현(Implementation) : 패턴을 구현할 때 주의해야 할 함정, 힌트, 기법등은 무엇? 특정 언어에 국한된 특이사항은 무엇?
  • 예제코드(Sample Code) : 주어진 패턴을 실제로 C++나 스몰토크를 이용해서 어떻게 구현할 수 있는가를 보여주는 코드
  • 잘 알려진 사용 예(Known Use) : 실제 시스템에서 찾아볼 수 있는 패턴들의 예로서 서로 다른 개발 분야에서는 쓰는 예제를 두 가지 이상 포함 시켰다
  • 관련 패턴(Related Pattern) : 이 패턴과 밀접하게 관련된 다른 패턴들은 무엇? 이들의 중요한 차이점은 무엇? 어떤 다른 패턴에 이 패턴이 사용되어 질까?
- 패턴을 분류하는 두가지 기준
  • 목적(Purpose), 범위(scope)
    • 목적의 분류
      • 생성 (creational) 패턴 : 객체의 생성 과정에 관여하는 패턴
      • 구조 (structural) 패턴 : 클래스나 객체의 합성에 관한 패턴
      • 행동 (behavioral) 패턴 : 클래스나 객체들이 상호작용하는 방법과 책임을 분산하는 방법을 정의하는 패턴
    • 범위의 분류
      • 클래스 패턴 : 클래스와 서브 클래스 간의 관련성을 다루는 패턴, 주로 상속, 컴파일 타임에 정적으로 결정됨
      • 객체 패턴 : 객체 관련성을 다루는 패턴으로, 런타임에 변경할 수 있고 동적인 성격을 가짐.
구분
목적
생성
구조
행동
범위
클래스
Factory Method - 팩토리 메서드
Adapter - 어댑터(class)
Interpreter - 인터프리터
Template Method - 템플릿 메서드
객체
Abstract Factory - 추상 팩토리
Builder - 빌더
Prototype - 프로토타입
Singleton - 싱글톤
Adapter - 어댑터(object)
Bridge - 브릿지
Composite - 컴포짓
Decorator - 데커레이터
Facade - 퍼사드
Flyweight - 플라이웨이
Proxy - 프록시
Chain of Responsibility 책임 연쇄
Command - 커맨드
Interpreter - 인터프리터
Mediator - 중재자
Memento - 메멘토
Observer - 옵저버
State - 상태
Strategy - 전략
Visitor - 비지터
  • 생성(creational) "클래스" 패턴 - 객체를 생성하는 책임의 일부를 서브클래스가 담당하도록 넘김
  • 생성(creational) "객체" 패턴 - 이를 다른 객체에게 위임
  • 구조(structural) "클래스" 패턴 - 상속을 이용해서 클래스를 복합
  • 구조(structural) "객체" 패턴 - 객체를 합성하는 방법을 정의
  • 행동(behavioral) "클래스" 패턴 - 상속을 이용해서 알고리즘과 제어 흐름을 기술
  • 행동(behavioral) "객체" 패턴 - 하나의 작업을 수행하기 위해 객체 집합이 어떻게 협력하는 지를 기술


# 디자인 패턴 카탈 로그
 - 카탈로그란? : 상품 안내서, 목록, 요람, 등의 뜻으로 볼 수 있다.
  • 관련 자료로 디자인쪽의 카탈로그와 브로슈어, 팸플릿, 리플릿에 관해 게시한 블로그 : http://daver.kr/xe/178409
  • 그렇다면 목록 쯤으로 볼 수 있겠다.
- 목록
[1]생성 패턴
Abstract Factory - 추상 팩토리 : 구체적인 클래스를 지정하지 않고 관련성을 갖는 객체들의 집합을 생성하거나 서로 독립적인 객체들의 집합을 생성할 수 있는 인터페이스를 제공하는 패턴

Builder - 빌더 : 복합 객체의 생성 과정과 표현방법을 분리하여 동일한 생성 절차에서 서로 다른 표현 결과를 만들 수 있게 하는 패턴

Factory Method - 팩토리 메서드 : 객체를 생성하는 인터페이스는 미리 정의하되, 인스턴스를 만들 클래스의 결정은 서브클래스 쪽에서 내리는 패턴 팩토리 메서드 패턴에서는 클래스의 인스턴스를 만드는 시점을 서브 클래스로 미룬다.

Prototype - 프로토타입 : 생성할 객체의 종류를 명세화하는 데에 원형이 되는 예시물을 이용하고, 그 원형을 복제함으로써 새로운 객체를 생성하는 패턴

Singleton - 싱글톤 : 어떤 클래스의 인스턴스는 오직 하나임을 보장하며, 이 인스턴스에 접근할 수 있는 전역적인 접촉점을 제공하는 패턴

[2]구조 패턴
Adapter - 어댑터 : 클래스의 인터페이스를 사용자가 기대하는 다른 인터페이스로 변환하는 패턴으로 호환성이 없는 인터페이스 때문에 함께 동작할 수 없는 클래스들이 함께 작동하도록 함

Bridge - 브릿지 : 구현부에서 추상층을 분리하여 각자 독립적으로 변형할 수 있게 하는 패턴

Composite - 컴포짓 : 객체들의 관계를 트리 구조로 구성하여 부분-천체 계층을 표현하는 패턴으로 사용자가 단일 객체와 복합 객체 모두 동일하게 다루도록 한다.

Decorator - 데커레이터 : 주어진 상황 및 용도에 따라 어떤 객체에 책임을 덧붙이는 패턴으로, 기능 확장이 필요할 때 서브클래싱 대신 쓸수 있는 유연한 대안

Facade - 퍼사드 : 서브 시스템에 있는 인터페이스 집합에 대해서 하나의 통합된 인터페이스를 제공하는 패턴으로, 서브시스템을 좀더 사용하기 편하게 만드는 상위 수준의 인터페이스를 정의

Flyweight - 플라이웨이 : 크기가 작은 객체가 여러개 있을 때, 공유를 통해 이들을 효율적으로 지원하는 패턴

Proxy - 프록시 : 어떤 다른 객체로 접근하는 것을 통제하기 위해서 그 객체의 대리자(surrogate)또는 자리채움자(Placehoder)를 제공하는 패턴

[3]행동 패턴
Chain of Responsibility - 책임 연쇄 : 요청을 처리할 수 있는 기회를 하나 이상의 객체에게 부여하여 요청을 보내는 객체와 그 요청을 받는 객체 사이의 결합을 피하는 패턴 요청을 받을 수 있는 객체를 연쇄적으로 묶고, 실제 요청을 처리할 객체를 만날 때까지 객체 고리를 따라서 요청을 전달합니다

Command - 커맨드 : 요청을 객체의 형태로 캡슐화하여 서로 요청이 다른 사용자의 매개변수화, 요청 저장 또는 로깅, 그리고 연산의 취소를 지원하게 만드는 패턴

Interpreter - 인터프리터 : 주어진 언어에 대해 그 언어의 문법을 위한 표현 수단을 정의하고 이와 아울러 그 표현 수단을 사용하여 해당 언어로 작성된 문장을 해석하는 해석기를 정의하는 패턴

Iterator - 이터레이터 : 내부 표현부를 노출하지 않고, 어떤 객체 집합에 속한 원소들을 순차적으로 접근할 수 있는 방법을 제공

Mediator - 중재자 : 한 집합에 속해있는 객체들의 상호작용을 캡슐화하는 객체를 정의하는 패턴 객체들이 직접 서로 참조하지 않도록 함으로써 객체들 사이의 소결합(loose coupling)을 촉진 시키며, 개발자가 객체들의 상호작용을 독립적으로 다양화시킬 수 있게 만든다.

Memento - 메멘토 : 캡슐화를 위해받지 않은 채 어떤 객체의 내부 상태를 잡아내고 실체화 시켜 이후에 해당 객체가 그 상태로 다시 되돌아올 수 있도록 하는 패턴

Observer - 옵저버 : 객체 사이에 일 대 다의 의존관계를 정의해 두어, 어떤 객체의 상태가 변할 때 그 객체의 의존성을 가진 다른 객체들이 그 변화를 통지 받고 자동으로 갱신 될 수 있게 만드는 패턴

State - 상태 : 객체의 내부 상태에 따라 스스로 행동을 변경할 수 있게 끔 허가하는 패턴으로 이렇게 하면 객체는 마치 자신의 클래스를 바꾸는 것처럼 보임

Strategy - 전략 : 동일 계열의 알고리즘 군을 정의 하고 각각의 알고리즘을 캡슐화하며 이들을 상호교환이 가능하도록 만드는 패턴 알고리즘을 사용하는 사용자와 상관없이 독립적으로 알고리즘을 다양하게 변경할수 있게 한다.

Template Method - 템플릿 메서드 : 객체의 연산에는 알고리즘의 뼈대만을 정의하고 각 단게에서 수행할 구체적 처리는 서브 클래스 쪽으로 미루는 패턴 알고리즘의 구조 자체는 그대로 놔둔채 알고리즘 각 단계의 처리를 서브클래스에서 재정의 할 수 있게 한다.

Visitor - 비지터 : 객체 구조를 이루는 원소에 대해 수행할 연산을 표현하는 패턴 연산을 적용할 원소의 클래스를 변경하지 않고도 새로운 연산을 정의할수 있게 함



반응형

'Programming' 카테고리의 다른 글

Programming/어셈블리어 종류 정리  (0) 2018.04.09