객체가 할 수 있는 행위들 각각을 전략으로 만들어 놓고 (캡슐화 하는 인터페이스 정의), 동적으로 행위의 수정이 필요한 경우 전략을 바꾸는 것 만으로 행위의 수정이 가능하도록 만든 패턴
즉, 동일한 문제를 다른 알고리즘(전략)으로 쉽게 바꾸며 해결할 수 있도록 하는 디자인 패턴
캡슐화
필요한 속성(attribute)와 행위(method)를 하나로 묶고 그 중 일부를 외부에서 사용하지 못하도록 은닉하는 것
(자세한 예시와 설명: https://javacpro.tistory.com/31)
OCP (open-closed-principle)
- 개방 폐쇄 원칙 : 소프트웨어 개체(클래스, 모듈, 함수)는 확장에 대해 열려있어야 하고, 수정에 대해서는 닫혀 있어야 함
- abtraction을 통한 inversion을 통해 소스코드를 변경하지 않고 그 모듈의 행위를 바꾸는 일이 가능
자바의 인터페이스(interface)와 추상클래스(abstract class)
- 모듈을 고정된 추상화에 의존하면 해당 모듈은 수정에 대해 닫혀 있는 것이 가능하게 됨
- 해당 모듈의 행위는 추상화의 새 파생 클래스를 만듦으로써 확장에 대해 열려있게 됨
추상클래스
- 일반 클래스와 유사. 단, 추상 메서드 선언으로 상속을 통해 자손 클래스에서 완성하도록 유도하는 클래스. 따라서 미완성 설계도로 존재.
- 상속을 위한 클래스이므로 따로 객체 생성이 불가.
- class 앞에 abstract 예약어를 사용하여 상속을 통해 구현해야 한다는 것을 알려줌
인터페이스
- 기본 설계도 c.f. 추상클래스 = 미완성 설계도
- 인터페이스도 추상클래스처럼 다른 클래스를 작성하는데 도움을 주는 목적으로 작성
- 클래스와 다르게 다중상속이 가능
전략패턴 사용의 예시
OCP 위반
client 객체가 새로운 server 객체를 사용하도록 바꾸고 싶다면, client 클래스를 수정하여 다른 server 클래스를 사용하도록 바꿔야 함 -> 수정에 대하여 닫혀있어야하는 ocp 위반
해결책
스트레티지 패턴의 사용: 확장이 필요한 부분에 abstraction추상화를 적용하여 상위모듈이 고정된 추상화에 의존하도록 -> 만약 새로운 server객체를 사용하고 싶다면 client interface를 구현한 새로운 클래스를 추가하면 됨
자바의 오버로딩(overloading)과 오버라이딩(overriding)
오버로딩
- 자바의 한 클래스 내 이미 사용하려는 이름과 같은 이름을 가진 메소드가 존재하더라도, 매개변수의 개수 또는 타입이 다르다면 같은 이름을 사용해서 메소드 정의가 가능 -> 다양한 유형의 호출에 응답 가능
- 메서드 오버로딩과 생성자 오버로딩이 존재하지만, 둘 다 같은 개념
오버라이딩
- 상위 클래스가 가지고 있는 메서드를 하위 클래스가 재정의해서 사용 가능
- 메소드의 이름이 같고, 매개변수의 개수나 타입이 달라야 함
- 오직 리턴값만 다른 것은 오버로딩이 불가
전략 패턴의 장단점
장점
- 경직성 문제 해소 : 한 군데의 변경이 프로그램의 다른 의존적인 모듈 변경을 일으키는 위험 낮아짐
- client가 고정된 추상화에 의존하여, 하위 모듈의 변경이 상위 모듈에 영향을 미치지 않음
- 부동성이 없음 : 추상화를 구현한 서브 클래스는 재활용이 가능해, 원하는 부분을 모듈로부터 분리해 다른곳에 사용이 가능함
단점
- 실제로 서비스 전 어느 부분에 변경이 필요해질지 예측하기 어려움 -> 미리 추상화를 해놓기 어려움
- 짧은 주기로 개발하고, 소프트웨어를 빨리 자주 릴리즈 하는 것으로 단점을 보완해갈 수 있음
references
https://victorydntmd.tistory.com/292
https://myjamong.tistory.com/150
https://devbelly.tistory.com/270
https://private.tistory.com/25