아~ 디자인 패턴 너모 많자나...
언제 끝나는지 아시는분~~~??
Strategy Pattern?
전략 패턴이란 실행 중에 알고리즘을 선택할 수 있게 하는 행위 소프트웨어 디자인 패턴이다.
특정한 계열의 알고리즘들을 정의하고 각 알고리즘을 캡슐화하며 이 알고리즘을 해당 계열 안에서 상호 교체가 가능하게 만든다!
아주그냥 이름처럼 전략적으로 사용하는 거군!
[사용이유]
구현된 알고리즘은 다르지만 동일한 목적을 지닌 클래스들이 존재할 때 사용한다!
확장이 용이하게!
[구조]
Strategy(전략)
- 전략을 이용하기 위한 인터페이스(API)를 결정합니다.
ConcreteStrategy(구체적인 전략)
- Strategy를 실제로 구현하는 역할
Context(문맥)
- Strategy의 인터페이스(API)를 호출해서 이용하는 역할
[구현]
에제에 사용할 클래스 다이어 그램입니다!
시나리오는 이렇습니다!
집에서 회사를 갈때는
버스를 이용했고
public class Bus implements TransportStrategy{
public void takeTransport(){
System.out.println("집에서 회사는 버스를!");
}
}
회사에서 집을 갈때는
지하철를 이용했습니다.
public class Train implements TransportStrategy{
public void takeTransport(){
System.out.println("회사에서 집으로는 지하철을!");
}
}
하지만 우리는 필요에 따라 다양한 교통 수단을 이용할 수 있죠!
어느날 집에서 회사를 가려고하는데 지하철을 이용하려고 합니다!
public class Train2 implements TransportStrategy{
public void takeTransport(){
System.out.println("집에서 회사로는 지하철을!");
}
}
엇 이런! 클래스를 한개 더 만들거나 Train의 문구를 변경 될때마다 수정해야하자나요!
에잇! 귀차나!
이렇게 수정하면 SOLID원칙중 OCP(개방폐쇄의 원칙 : open close principle)에 위배가 됩니다!
OCP란!?
기존의 코드를 변경하지 않으면서 기능을 추가할 수 있도록 설계되어야 한다. OCP에서 중요한 것은 요구사항이 변경되었을 때 코드에서 변경되어야 하는 부분과 변경되지 않아야하는 부분을 명확하게 구분하여, 변경되어야 하는 부분을 유연하게 작성하는 것을 의미한다. 또한 확장에는 유연하게 반응하며 변경은 최소화하는 것을 의미한다.
또 하나의 관점은 클래스를 변경하지 않고도 대상 클래스의 환경을 변경할 수 있는 설계가 되어야 한다.
자 그래서! 기존 클래스는 건드리지 않고! 집에서 회사까지 지하철을 타고 퇴근을 해봅시다!
부릉부릉~
Strategy
public interface TransportationStrategy {
void takeTransportation();
}
StrategyImpl
public class TransportationStrategyImpl {
private TransportationStrategy transportationStrategy;
public void takeTransportation() {
transportationStrategy.takeTransportation();
}
public void setTransportationStrategy(TransportationStrategy transportationStrategy) {
this.transportationStrategy = transportationStrategy;
}
}
BusStrategy
public class BusStrategy implements TransportationStrategy {
@Override
public void takeTransportation() {
System.out.println("버스를 탈꺼야!");
}
}
TrainStrategy
public class TrainStrategy implements TransportationStrategy {
@Override
public void takeTransportation() {
System.out.println("기차를 탈꺼야!");
}
}
MyHome
public class MyHome extends TransportationStrategyImpl{
}
MyCompany
public class MyCompany extends TransportationStrategyImpl{
}
TransportationApplication
public class TransportationApplication {
public static void main(String[] args) {
TransportationStrategyImpl myHome = new MyHome();
TransportationStrategyImpl myCompany = new MyCompany();
// 집에서는 버스를 타고
myHome.setTransportationStrategy(new BusStrategy());
myHome.takeTransportation();
// 회사에서는 지하철을 탐
myCompany.setTransportationStrategy(new TrainStrategy());
myCompany.takeTransportation();
// 집에서 지하철타기 가능
myHome.setTransportationStrategy(new TrainStrategy());
myHome.takeTransportation();
}
}
이제 어디서든 아무 교통수단이나 탈 수 있다!
[장점]
- 기존 클래스의 코드 변경 없이 새로운 전략을 추가할 수 있습니다!
- 그렇다는 것은 SOLID원칙의 OCP의 원칙을 지킬 수 있따!!
- 코드 중복을 방지할 수 있따!
- 확장성이 용이하다!
[단점]
- TransportationApplication을 보시면 아시겠지만 객체를 너무많이 생성해야한다.
아 디자인패턴 너무많아 징짜~!!
오늘도 제 공부에 도움을 주신 많은 블로거분들 너무 감사합니다!
https://scorpio-mercury.tistory.com/21
https://victorydntmd.tistory.com/292
https://lee1535.tistory.com/93
https://bamdule.tistory.com/164
** 그냥 하루하루 개인 공부한 것을 끄적 거리는 공간입니다.
이곳 저곳에서 구글링한 것과 강의 들은
내용이 정리가 되었습니다.
그림들은 그림밑에 출처표시를 해놓았습니다.
문제가 될시 말씀해주시면 해당 부분은 삭제 하도록하겠습니다. **
'public void static main > Etc' 카테고리의 다른 글
[WEB] 동기 & 비동기 (0) | 2022.10.14 |
---|---|
[OS] 프로그램과 프로세스 (0) | 2022.02.21 |
[OS] 멀티 프로그램, 프로세싱 (0) | 2022.02.01 |
[OS] 메모리 영역 (0) | 2022.02.01 |
[Swagger] 스웩! 췤! (0) | 2022.01.29 |
댓글