https://www.inflearn.com/course/디자인-패턴
어댑터 패턴
패턴 소개
- 기존 코드를 클라이언트가 사용하는 인터페이스의 구현체로 바꿔주는 패턴
- 클라이언트가 사용하는 인터페이스를 따르지 않는 기존코드를 재사용 할 수 있게 해준다.
- 별도의 클래스 생성하기와 인터페이스 상속받아 구현하기 방법이 있다.
- OCP 및 SRP와 관련된 패턴
- 장점
> 기존 코드를 변경하지 않고 원하는 인터페이스 구현체를 만들어 재사용 할 수 있다.
> 기존 코드가 하던 일과 특정 인터페이스 구현체를 변환하는 작업을 각기 다른 클래스로 분리하여 관리할 수 있다.
- 단점
> 새 클래스가 생겨 복잡도가 증가할 수 있다. 경우에 따라서는 기존코드가 해당 인터페이스를 구현하도록 하자.
자바와 스프링에서 찾아보는 패턴
- Array.asList
- Collections.enumeration
- Collections.list
- 스프링 MVC Handler Adaptor
브릿지 패턴
패턴 소개
- 추상적인 것과 구체적인 것을 분리하여 연결하는 패턴
> 사용자는 추상적인것만 사용
- 상속이 아닌 조합 (Composition) 을 사용함
- 나눠진 것을 브릿지를 만들어 연결하여 사용한다.
- Skin과 Champion으로 예시를 만듬
- 장점
> 추상적인 코드를 구체적인 코드 변경 없이도 독립적으로 확장할 수 있다.
> 추상적인 코드와 구체적인 코드를 분리할 수 있다.
- 단점
> 계층 구조가 늘어나 복잡도가 증가할 수 있다.
자바와 스프링에서 찾아보는 패턴
- JDBC
> Connection 획득하고, Statement 실행하는 곳은 추상적인 부분
> 구체적인 부분은 Dirver 내에 있음
- Slf4j
> 로깅퍼사드가 추상화된 부분
> 로거들이 구현체
- Mailsender , PlatformTransactionManager
컴포짓 패턴
패턴 소개
- 트리 구조를 구성해야 하는 제약조건이 있음
- 그룹 전체와 개별 객체를 동일하게 처리할 수 있는 패턴
- 클라이언트 입장에서는 '전체'나 '부분'이나 모두 동일한 컴포넌트로 인지할 수 있는 계층 구조를 만든다.
- composite (Component 의 List) 은 leaf node를 참고하지않고, Component 인터페이스를 참고해야 한다.
- 전체나 부분이나 클라이언트는 동일하게 다룰 수 있다.
- 장점
> 복잡한 트리구조를 편하게 사용할 수 있다.
> 다형성과 재귀를 활용할 수 있다.
> 새로운 타입의 Leaf Component가 추가되어도 Client는 변경되지 않는다. (OCP 원칙)
자바와 스프링에서 찾아보는 패턴
- 자바 Swing
-> JButton, JTextField는 Component 상속
-> JFrame은 Composite
데코레이터 패턴
패턴 소개
- 런타임에 기존 코드를 확장하는 방법
- 상속은 유연하지 않다.
-> 다중상속 문제
- 기존코드를 변경하지 않고 부가기능을 추가하는 패턴
- 상속이 아닌 위임을 사용해서 보다 유연하게 (런타임에) 부가기능을 추가하는 것도 가능하다.
- 장점
> 새로운 클래스를 만들지 않고, 기존 기능을 조합할 수 있다.
> SRP
> 컴파일 타임이 아닌 런타임에 동적으로 기능을 변경할 수 있다.
- 단점
> 데코레이터를 조합하는 코드가 복잡할 수 있다.
자바와 스프링에서 찾아보는 패턴
- IO 관련하여 다른 인터페이스를 감싸면서 다른 구현체, 인터페이스를 반환
- HttpRequestWrapper
- Bean decorator
- HttpReqeustDecorator
퍼사드 패턴
패턴 소개
- 퍼사드는 건물의 입구쪽 전경을 나타내는 말
- 복잡한 서브 시스템 의존성을 최소화 하는 방법
- 클라이언트가 사용해야하는 복잡한 서브시스템 의존성을 간단한 인터페이스로 추상화 할 수 있다.
- 장점
> 서브시스템에 대한 의존성을 한곳으로 모을 수 있다.
- 단점
> 퍼사드 클래스가 서브시스템에 대한 모든 의존성을 가지게 된다.
자바와 스프링에서 찾아보는 패턴
- MailSender <-> JavaMailSenderImpl
- PlatformTransactionManager <-> Jdbc TransactionManager
플라이 웨이트 패턴
패턴 소개
- 자주 사용하는 속성을 재사용해서 메모리 낭비를 줄임
> extrinsic : 자주 사용하는 속성 (외인성)
> intrinsic : 변하지 않는 속성 (본질적인)
- 객체를 가볍게 만들어 메모리 사용을 줄이는 패턴
- 'final'을 사용하여 instrisit 객체 구성 (immutable)
> Intrinsit에 Factory 구축하여 캐시역할을 함
- 도메인에서 주로 사용
- 단점
> 복잡도 증가
자바와 스프링에서 찾아보는 패턴
- Integer valueOf
> -128 ~ 128은 캐싱하며, 자주 사용하는 수도 캐싱함
+) valueOf vs parseInt
프록시 패턴
패턴 소개
- 특정한 객체의 operation을 지나기 전에 프록시 객체를 거치게 함
- 특정 객체에 대한 접근을 제어하거나 기능을 추가할 수 있는 패턴
- 장점
> 기존 코드를 변경하지 않고 새로운 기능을 추가할 수 있다. (OCP, SRP)
> 초기화 지연등을 다양하게 활용할 수 있다.
- 단점
> 코드 복잡도 증가
'디자인 패턴' 카테고리의 다른 글
[디자인 패턴] 코딩으로 학습하는 GoF의 디자인 패턴 - 3 (0) | 2022.02.27 |
---|---|
[디자인 패턴] 코딩으로 학습하는 GoF의 디자인 패턴 - 1 (0) | 2022.02.13 |