전략 패턴(헤드 퍼스트 디자인 패턴)

김민건·2023년 7월 17일
1

Design pattern

목록 보기
1/1
post-thumbnail

'헤드 퍼스트 디자인 패턴'을 정리한 내용입니다.

디자인 원칙

  • 애플리케이션에서 달라지는 부분을 찾아내고, 달라지지 않는 부분과 분리한다.
  • 구현보다는 인터페이스에 맞춰서 프로그래밍한다.
  • 상속보다는 구성을 활용한다.

전략 패턴(Strategy Pattern)

전략 패턴(Strategy Pattern)은 알고리즘군을 정의하고 캡슐화해서 각각의 알고리즘군을 수정해서 쓸 수 있게 해줍니다.
전략 패턴을 사용하면 클라이언트로부터 알고리즘을 분리해서 독립적으로 변경할 수 있습니다.

슈퍼클래스가 아래와 같이 존재한다고 가정한다.

Duck
quack()
swim()
display()

고무 오리, 러버덕 과 같은 오리가 위의 Duck을 상속받는다고 하자.
Duck에 fly()를 추가하는 경우, 하위의 모든 오리에 적용되는 결과가 발생한다.
고무 오리와 러버덕을 울지도 날지도 못하지만 fly()와 quack()의 실행이 가능해진다.

상속으로 해결할 경우(추천하지 않는 이유)

Duck
quack()
swim()
display()
fly()

----------------------------
RubberDuck
quack() { // 삑삑}
fly() {// 날지 않도록 오버라이드}
----------------------------
DecoyDuck
quack() {// 울지 않도록 오버라이드}
fly() {// 날지 않도록 오버라이드}
  • 서브 클래스에서 코드가 중복된다.
  • 실행 시에 특징을 바꾸기 힘들다.
  • 모든 객체의 행동을 알기 힘들다.
  • 코드를 변경했을 때 다른 객체들에게 원치 않는 영향을 끼칠 수 있다.

슈퍼 클래스(Duck)에서 분리하여 해결할 경우(추천하지 않는 이유)

Duck
swim()
display()
// fly, quack 제거
----------------------------
Flyable
fly()
----------------------------
Quackable
quack()
----------------------------
RubberDuck
display()
quack() // 오버라이딩
----------------------------
MallardDuck
display()
fly() // 오버라이딩
quack() // 오버라이딩
  • 코드의 중복
    각 오리의 오버라이딩의 중복
  • 재사용 불편
  • 변경에 유연하지 못함
    나는것에 변경이 있는 경우 모든 오버라이딩을 수정이 필요


바뀌는 부분과 그렇지 않은 부분 분리하기

fly()와 quack()을 제외한 부분은 공통이다.
fly()와 quack()을 분리해야 한다.

인터페이스(추상)화

Duck
FlyVehavior flyVehavior
QuackBehavior quackBehavior
----------------------------
FlyVehavior
fly()
----------------------------
FlyWithWings
fly() {// 하늘을 나는 방법 구현}
----------------------------
FlyNoWay
fly*( {// 못 날아요~}
----------------------------
QuackBehavior
quack()
----------------------------
Quack
quack() {// 꽥꽥}
----------------------------
Squeak
quack() {// 삑삑}
----------------------------
MuteQuack
quack() {// 소리를 못내요~}
  • 재사용 가능(Duck Class에서 제어하지 않아서 가능)
  • fly, quack의 추가나 수정에도 기존 클래스(Duck)에 영향이 없다.

동적으로 지정

Dock
public void setFlyBehavior(FlyBehavior fb) {
	flyBehavior = fb;
}
----------------------------
Main
Duck model = new RubberDuck();
model.setFlyBehavior(new FlyWithWings());

위와 같이 동적으로 행동을 지정해 설정할 수 있다.

profile
BackEnd Developer

0개의 댓글