본문 바로가기
public void static main()/Design Pattern

[Design Pattern] Strategy Pattern

by 햄리뮤 2022. 2. 5.
반응형

아~ 디자인 패턴 너모 많자나...

언제 끝나는지 아시는분~~~??

 

https://refactoring.guru/design-patterns/strategy

Strategy Pattern?

전략 패턴이란 실행 중에 알고리즘을 선택할 수 있게 하는 행위 소프트웨어 디자인 패턴이다.

특정한 계열의 알고리즘들을 정의하고 각 알고리즘을 캡슐화하며 이 알고리즘을 해당 계열 안에서 상호 교체가 가능하게 만든다!

아주그냥 이름처럼 전략적으로 사용하는 거군!

 

[사용이유]

구현된 알고리즘은 다르지만 동일한 목적을 지닌 클래스들이 존재할 때 사용한다!

확장이 용이하게!

 

[구조]

Strategy(전략)

  • 전략을 이용하기 위한 인터페이스(API)를 결정합니다.

ConcreteStrategy(구체적인 전략)

  • Strategy를 실제로 구현하는 역할

Context(문맥)

  • Strategy의 인터페이스(API)를 호출해서 이용하는 역할

https://refactoring.guru/design-patterns/strategy

[구현]

에제에 사용할 클래스 다이어 그램입니다!

https://refactoring.guru/design-patterns/strategy

시나리오는 이렇습니다!

집에서 회사를 갈때는

버스를 이용했고

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에서 중요한 것은 요구사항이 변경되었을 때 코드에서 변경되어야 하는 부분과 변경되지 않아야하는 부분을 명확하게 구분하여, 변경되어야 하는 부분을 유연하게 작성하는 것을 의미한다. 또한 확장에는 유연하게 반응하며 변경은 최소화하는 것을 의미한다. 
또 하나의 관점은 클래스를 변경하지 않고도 대상 클래스의 환경을 변경할 수 있는 설계가 되어야 한다.

자 그래서! 기존 클래스는 건드리지 않고! 집에서 회사까지 지하철을 타고 퇴근을 해봅시다!

부릉부릉~

https://refactoring.guru/design-patterns/strategy

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://velog.io/@kyle/%EB%94%94%EC%9E%90%EC%9D%B8-%ED%8C%A8%ED%84%B4-%EC%A0%84%EB%9E%B5%ED%8C%A8%ED%84%B4%EC%9D%B4%EB%9E%80

 

디자인 패턴 : 전략패턴이란?

디자인 패턴에서 전략패턴이란 무엇인가?

velog.io

https://scorpio-mercury.tistory.com/21

 

Strategy Pattern

#Strategy Pattern 1. 개념 전략 패턴(Strategy Pattern)이란 알고리즘 대체를 위해 동일한 목적을 지닌 알고리즘군을 인터페이스로 묶고 캡슐화하여 서로 대체가 가능하게 사용하는 것을 말한다. 예를 들

scorpio-mercury.tistory.com

https://velog.io/@kyle/%EA%B0%9D%EC%B2%B4%EC%A7%80%ED%96%A5-SOLID-%EC%9B%90%EC%B9%99-%EC%9D%B4%EB%9E%80

 

객체지향 SOLID 원칙 이란?

객체지향에서 SOLID 원칙이란 무엇인가?

velog.io

https://victorydntmd.tistory.com/292

 

[디자인패턴] 전략 패턴 ( Strategy Pattern )

전략 패턴 ( Strategy Pattern ) 객체들이 할 수 있는 행위 각각에 대해 전략 클래스를 생성하고, 유사한 행위들을 캡슐화 하는 인터페이스를 정의하여, 객체의 행위를 동적으로 바꾸고 싶은 경우

victorydntmd.tistory.com

https://lee1535.tistory.com/93

 

[디자인패턴/Design Pattern] Strategy 패턴 / 전략 패턴

관련 내용은 [자바 언어로 배우는 디자인 패턴 입문] , [Head First Design Pattern] 의 내용을 참고해서 정리한 내용입니다. 잘못된 부분은 댓글로 지적해주시면 감사하겠습니다. 1. Strategy 패턴이란? 알

lee1535.tistory.com

https://bamdule.tistory.com/164

 

[DesignPattern] 전략 패턴(Strategy Pattern)

1. 전략 패턴이란? 전략 패턴은 실행 중에 알고리즘을 선택할 수 있게 하는 행위 소프트웨어 디자인 패턴이다. - 위키 백과 동일 계열의 알고리즘군을 정의하고, 각 알고리즘을 캡슐화하며, 이들

bamdule.tistory.com

** 그냥 하루하루 개인 공부한 것을 끄적 거리는 공간입니다.

이곳 저곳에서 구글링한 것과 강의 들은

내용이 정리가 되었습니다.

그림들은 그림밑에 출처표시를 해놓았습니다.

문제가 될시 말씀해주시면 해당 부분은 삭제 하도록하겠습니다. **

반응형

댓글