티스토리 뷰

디자인 패턴

21. 전략 패턴

jin-park 2022. 2. 11. 11:31

1. 전략 패턴

  • 여러 알고리즘을 캡슐화하고 상호 교환 가능하게 만드는 패턴
  • 컨텍스트에서 사용할 알고리즘을 클라이언트가 선택한다.

다이어그램

2. 상태 패턴 적용

2.1. 적용 전 코드

  • 전략(Speed)을 바꿔야할 경우, BlueLightRedLight 코드를 그 때마다 수정해줘야한다.
public class BlueLightRedLight {
 
    private int speed;
 
    public BlueLightRedLight(int speed) {
        this.speed = speed;
    }
 
    public void blueLight() {
        if (speed == 1) {
            System.out.println("무 궁 화    꽃   이");
        } else if (speed == 2) {
            System.out.println("무궁화꽃이");
        } else {
            System.out.println("무광꼬치");
        }
 
    }
 
    public void redLight() {
        if (speed == 1) {
            System.out.println("피 었 습 니  다.");
        } else if (speed == 2) {
            System.out.println("피었습니다.");
        } else {
            System.out.println("피어씀다");
        }
    }
}
public class Client {
    public static void main(String[] args) {
        BlueLightRedLight blueLightRedLight = new BlueLightRedLight(3);
        blueLightRedLight.blueLight();
        blueLightRedLight.redLight();
    }
}

2.2. 상태 패턴 적용 후 코드

  • 전략(Speed) 별로 분리된 클래스를 생성하여 Client에게 상황에 맞게 필요한 인스턴스를 주입받는다.
public interface Speed {
    void blueLight();
    void redLight();
}
public class Normal implements Speed {
    @Override
    public void blueLight() {
        System.out.println("무 궁 화    꽃   이");
    }
 
    @Override
    public void redLight() {
        System.out.println("피 었 습 니  다.");
    }
}
public class Faster implements Speed {
    @Override
    public void blueLight() {
        System.out.println("무궁화꽃이");
    }
 
    @Override
    public void redLight() {
        System.out.println("피었습니다.");
    }
}
public class Fastest implements Speed{
    @Override
    public void blueLight() {
        System.out.println("무광꼬치");
    }
 
    @Override
    public void redLight() {
        System.out.println("피어씀다.");
    }
}
public class Client {
 
    public static void main(String[] args) {
        BlueLightRedLight game = new BlueLightRedLight();
        game.blueLight(new Normal());
        game.redLight(new Fastest());
    }
}

3. 장단점

3.1. 장점

  • 새로운 전략을 추가하더라도 기존 코드를 수정하지 않는다
  • 상속 대신 위임을 사용할 수 있다.
  • 런타임에 전략을 변경할 수 있다.

3.2. 단점

  • 복잡도가 증가한다.
  • 클라이언트 코드가 구체적인 전략을 알아야 한다.

위글은 인프런의 코딩으로 학습하는 GoF의 디자인 패턴강의를 정리하였습니다.

백기선님의 수락으로 정리하였으며 더 자세한 내용은 강의를 수강하시기 바랍니다.

https://www.inflearn.com/course/%EB%94%94%EC%9E%90%EC%9D%B8-%ED%8C%A8%ED%84%B4/dashboard

 

코딩으로 학습하는 GoF의 디자인 패턴 - 인프런 | 강의

디자인 패턴을 알고 있다면 스프링 뿐 아니라 여러 다양한 기술 및 프로그래밍 언어도 보다 쉽게 학습할 수 있습니다. 또한, 보다 유연하고 재사용성이 뛰어난 객체 지향 소프트웨어를 개발할

www.inflearn.com

 

'디자인 패턴' 카테고리의 다른 글

22. 템플릿 메소드 패턴  (0) 2022.02.11
20. 상태(State) 패턴  (0) 2022.02.11
19. 옵저버 패턴  (0) 2022.02.11
18. 메멘토 패턴  (0) 2022.02.10
17. 중재자 패턴  (0) 2022.02.10
댓글