OCP(Open Close Principle) - 개방폐쇄의 원칙
확장에 대해서는 개방, 변경에 대해서는 폐쇄
적용방법
-
상속(is-a) <-상위가 바뀌면 하위에 영향이 매우 큼
-
컴포지션(has-a) <- 추천
- 변경(확장)될 것과 변하지 않을 것을 엄격히 구분
- 이 두 모듈이 만나는 지점에 인터페이스를 정의
- 구현에 의존하기보다 정의한 인터페이스에 의존하도록 코드를 작성
장점
- 기능이 추가, 변경되어도 기존 코드는 변경되지 않는다 -> 확장이 쉽다
- 구현체를 주입해서 테스트가 가능
해결
- if else 문제점
변경 확장될 수록 코드 복잡 -> 유지보수가 점점 어려워짐 (OCP를 통해 해결 가능)
전략 패턴
기존의 코드 변경 없이 행위를 자유롭게 바꿀 수 있게 해주는 OCP를 준수한 디자인 패턴
특징
- 디자인 패턴의 꽃 ( 그만큼 많이 활용, 다른 디자인 패턴에서도 많이 이용)
- 전략을 쉽게 바꿀 수 있도록 해주는 디자인 패턴
- 행위를 클래스로 캡슐화해 동적으로 행위를 자유롭게 바꿀 수 있게 해주는 패턴
- 새로운 기능의 추가가 기존의 코드에 영향을 미치지 못하게 해 OCP를 만족
구성
- Context
- 스트래티지 패턴을 이용하는 역할 수행
- 필요에 따라 동적으로 구체적인 전략을 바꿀수 있도록 함(DI(의존성 주입))
- Strategy
인터페이스나 추상 클래스로 외부에서 동일한 방식으로 알고리즘을 호출하는 방법을 명시
- ConcreateStrategy
전략패턴에서 명시한 알고리즘을 실제로 구현한 클래스
Template Method 패턴과 차이
같은 점 - 둘다 OCP를 준수
템플릿 메서드 패턴은 상속(is-a) 이용 (전략 패턴은 컴포지션(has-a) 이용)