본문 바로가기
Develop

개발자가 반드시 정복해야 할 객체 지향과 디자인패턴 2

by _dreamgirl 2020. 2. 22.
반응형

Part3. 주요 디자인 패턴

 

GOF의 디자인패턴

  • 전략패턴/ 템플릿 메서드 패턴 / 상대패턴
  • 데코레이터 패턴 / 프록시 패턴 / 어댑터 패턴
  • 옵저버 패턴 / 미디에이터 패턴 / 파사드 패턴
  • 추상팩토리패턴 / 컴포지턴 패턴

 

널(Null) 객체 패턴

 

  1. 전략(Strategy) 패턴
  • 완전히 동일한 기능을 제공하지만 성능의 장단점에 따라 알고리즘을 선택해야 하는 경우에도 전략 패턴을 사용한다.
  • 일반적으로 if-else로 구성된 코드 블록이 비슷한 기능(비슷한 알고리즘)을 수행하는 경우에 전략 래턴을 적용함으로써 코드를 확장하도록 변경할 수 있다.
  • Ex) 첫 손님 할인 정책과 저녁 시간대에 신선도가 떨어진 과일에 대한 덜 신선한 과일 할인 정책에 대한 가격 계산 모듈

 

  1. 탬플릿 메서드(Template Method) 패턴
  • 실행 과정을 구현한 상위 클래스
  • 실행 과정의 일부 단계를 구현한 하위 클래스
  • 주로 절차 중 일부 과정의 구현만 다를 뿐 나머지의 구현은 똑같을 때
  • 훅(hook) 메소드 : 상위 클래스에서 실행 시점에 제어되고, 기본 구현을 제공하면서 하위 클래스에서 알맞게 확장할 수 있는 메소드 ex) AsyncTask

 

  1. 상태(State) 패턴
  • 상태에 따라 동일한 기능 요청의 처리를 다르게 함
  • 새로운 상태가 추가되더라도 콘텍스트 코드가 받는 영향은 최소화된다.
  • 상태에 따른 동작을 구현한 코드가 각 상태 별로 구분되기 때문에 상태 별 동작을 수정하기가 쉽다.
  • Ex) 자판기 프로그램

 

  1. 데코레이터(Decorator) 패턴
  • 상속이 아닌 위임을 하는 방식으로 기능을 확장해 나가는 패턴
  • 데이터를 조합하는 방식으로 기능을 확장할 수 있기 때문에 기능 적용 순서 변경도 쉽다.
  • Ex) FileInputStream, InputStream, BufferedReader

 

  1. 프록시(proxy) 패턴
  • 실제 객체에 대한 접근을 제어하는데 초점이 맞춰져 있다. 프록시를 구현 할 때 고려할 점은 실제 객체를 누가 생성할 것이냐에 대한 것
  • Ex) 제품 목록을 보여주는 GUI 프로그램

 

  1. 어댑터(Adapter) 패턴
  • 상속을 이용한 어댑터 구현
  • SLF4J는 동일 API로 여러 로깅 프레임워크를 사용할 수 있도록 어댑터 패턴을 사용하고 있다.
  • Ex) SLF4J라는 로깅 API

 

  1. 옵저버(Observer) 패턴
  • 한 객체의 상태 변화를 정해지지 않은 여러 다른 객체에 통지하고 싶을 때 사용되는 패턴
  • 주제 클래스 변경 없이 상태 변경을 통지 받을 옵저버를 추가 할 수 있다.
  • Ex) View의 OnClickListener

 

GOF의 디자인패턴

  • 전략패턴/ 템플릿 메서드 패턴 / 상대패턴
  • 데코레이터 패턴 / 프록시 패턴 / 어댑터 패턴
  • 옵저버 패턴 / 미디에이터 패턴 / 파사드 패턴
  • 추상팩토리패턴 / 컴포지턴 패턴

 

널(Null) 객체 패턴

 

  1. 미디에이터(Mediator) 패턴
  • 각 협업 클래스에 흩어져 있는 흐름 제어를 미디에이터로 모으기 때문에 각 협업 클래스의 코드가 단순해진다.
  • Ex) 비디오 플레이어 프로그램

 

  1. 파사드(Facade) 패턴
  • 코드 중복과 직접적인 의존을 해결하는데 도움을 주는 패턴
  • 서브 시스템을 감춰 주는 상위 수준의 인터페이스를 제공한다.
  • 파사트 패턴을 적용하면 클라이언트는 파다스에만 의존하기 때문에, 서브 시스템의 일부가 변경되더라도 그 여파는 파사드로 한정될 가능성이 높다.

 

  1. 추상 팩토리(Abstract Factory) 패턴
  • 클라이언트에 영향을 주지 않으면서 사용할 제품(객체) 군을 교체할 수 있다.
  • 추상 팩토리 패턴에서는 관련된 객체 군을 생성하는 책임을 갖는 타입을 별도로 분리한다. 
  • Ex) JDBC API 구조

 

  1. 컴포지트(Composite) 패턴
  • 컴포넌트 그룹을 관리한다.
  • 컴포지트에 기능 실행을 요청하면, 컴포지트는 포함하고 있는 컴포넌트들에게 기능 실행 요청을 위임한다.
  • Ex) 빌딩의 장비들의 전원을 관리하는 제어 프로그램

 

  1. 널(Null) 객체 패턴
  • Null 검사 코드를 사용할 필요가 없기 때문에 코드가 간결해진다.
  • Null 대신 사용될 클래스를 구현한다. 이 클래스는 상위 타입을 상속받으며, 아무 기능도 수행하지 않는다. 
  • Null 리턴하는 대신, null 대체할 클래스의 객체를 리턴한다.
반응형

댓글