본문 바로가기
Design Pattern

[Design Pattern] 전략 패턴

by 진꿈청 2024. 3. 12.

전략 패턴은 디자인 패턴의 꽃이라고 불리우는 패턴이다.

 

전략 패턴을 제대로 적용하지 않으면 다른 모든 디자인 패턴들이 의미가 없을 정도로 중요하다고 한다.

 

코드로 살펴보기 전에 이해를 돕기 위한 그림은 다음과 같다.

 

문지기의 입구에서 들어오는 무언가를 관리한다고 하자.

 

이때, 맨처음에는 쥐만을 쫓아내라고 명령을 내렸다가 다음에는 호랑이 등으로 추가될 때 마다 명령을 새로 줘야한다.

이는 문지기 입장에서 복잡한 상황이 될 것이다. 예를 들어 64 종류의 동물들을 쫓아내라고 한다면 문지기는 이걸 다 기억해야 한다.

결국 동물로 추상화하여 명령을 주는 것이 전략 패턴이라고 생각하면 된다.

 

 

코드 예시

 

Mouse

public class Mouse{
    private String name = "쥐";

    public String getName() {
        return name;
    }
}

 

DoorMan

public class DoorMan {

    public void 쫓아내(Mouse m){
        System.out.println(m.getName() + " 쫓아내");
    }
}

 

이런 클래스 구성이라면 DoorMan은 쥐를 잘 쫓아낼 것이다.

그러나, 고양이도 쫓아내라고 한다면?

 

DoorMan(Cat 추가)

public class DoorMan {

    public void 쫓아내(Mouse m){
        System.out.println(m.getName() + " 쫓아내");
    }

    // 추가된 코드
    public void 쫓아내(Cat c){
        System.out.println(c.getName() + " 쫓아내");
    }
}

 

고양이와 관련된 코드를 추가로 작성해야 한다.

이는 동물이 추가될 때마다 번거러운 작업이 될 것이다.

 

따라서, 우리는 구체적으로 바라보고 있는 타겟을 추상적인 타겟으로 바꿔야 한다.

이것을 전략 패턴이라고 하고 SOLID에서 설명한 DIP(의존성 역전 원칙)이다.

 

 

바뀐 코드

// 추상 클래스인 Animal 추가
public abstract class Animal {
    public abstract String getName();
}

// Animal 상속
public class Mouse extends Animal{
    private String name = "쥐";

    public String getName() {
        return name;
    }
}

// Cat 상속
public class Cat extends Animal{
    private String name = "고양이";

    public String getName() {
        return name;
    }
}

// 추상적인 Animal을 받는 DoorMan
public class DoorMan {

    public void 쫓아내(Animal a){
        System.out.println(a.getName() + " 쫓아내");
    }
}

 

즉, DoorMan이 추상적인 Animal에 의존한다.

구체적인 것들을 추상화해서 추상적인걸로 바라보는 패턴이 곧 전략패턴이다.

'Design Pattern' 카테고리의 다른 글

[Design Pattern] 탬플릿 메서드 패턴  (0) 2024.03.28
[Design Pattern] 싱글톤 패턴  (0) 2024.03.25
[Design Pattern] 어댑터 패턴  (0) 2024.03.18
[Design Pattern] 프록시 패턴  (1) 2024.03.12
SOLID란?  (3) 2024.03.11