본문 바로가기
학습/Java

전략패턴이란?

코동이 2021. 8. 1.

전략(Stragetegy)패턴이란?

여러 알고리즘을 추상적인 접근점(인터페이스)을 만들어 접근점에서 서로 교환 및 실행(델리게이트) 가능하도록 하는 패턴이다.

 

전략패턴을 위해서는 인터페이스, 델리게이트에 대한 이해가 필요하다. 왜냐하면, 접근점은 인터페이스로 만들고 알고리즘을 구현하는 작업은 델리게이트 방식으로 해결하기 때문이다.

 

인터페이스(interface)란?

인터페이스는 기능의 선언과 구현을 분리하도록 한다. 기능 구현의 통로로 이용된다. 인터페이스라는 접근점을 설정해두면, 상황에 따라서 적절한 알고리즘을 사용하면 된다.

 

델리게이트(delegate)란?

사전적 뜻으로는 '위임하다'이며 특정 객체에 특정 처리를 위임해주는 것, 즉 책임을 넘겨주는 것이다.

다시 말해, 특정 객체의 기능을 사용하기 위해 현재 위치에서 다른 객체의 기능을 호출하는 것이다.

 

Client : Strategy 인터페이스를 가지고 있습니다. 구체적인 전략을 설정하기 위한 setter 메서드가 필요합니다.

 

Stragtegy : 전략 패턴의 접근점으로 구현하는 구체적인 전략 구현에 따라서 쓰임새가 달라집니다

 

Starget A,B,C : Strategy를 구현한 구체적인 전략입니다. Strategy 인터페이스를 통로로 삼아 실제 Client의 Strategy로 선택됩니다.

 

- Weapon(interface)

public interface Weapon {
    public void attack();
}

 

- Knife(class)

public class Knife implements Weapon{
    @Override
    public void attack() {
        System.out.println("칼 공격");
    }
}

- Sword(class)

public class Sword implements Weapon{
    @Override
    public void attack() {
        System.out.println("검 공격");
    }
}

 

- GameCharacter(class)

public class GameCharacter {
    //접근점
    private Weapon weapon;

    //교환 가능
    public void setWeapon(Weapon weapon) {
        this.weapon = weapon;
    }
    public void attack(){
        if (weapon == null) {
            System.out.println("맨손 공격");
        } else {
            //위임(Delegate)
            weapon.attack();
        }
    }
}

Weapon은 인터페이스로서 접근점의 역할을 합니다.

setWeapon의 setter함수를 통해서 어떤 Weapon을 사용하는지 정합니다.

weapon.attack()을 통해 다른 클래스에 책임을 위임합니다.

 

- Main(class)

public class main {
    public static void main(String[] args) {
        Client client = new Client();
        client.attack();

        client.setWeapon(new Knife());
        client.attack();

        client.setWeapon(new Sword());
        client.attack();
    }
}

 

결과

맨손 공격

칼 공격

검 공격

 

- 전략패턴을 통해 다른 무기(Weapon)을 추가하는 확장성이 편리해 졌습니다. GameCharacter에 칼 공격, 검 공격의 메서드를 추가해 준 것이 아닌, 각각 클래스에서 공격(attack())을 재정의 했던과 마찬가지로 새로운 무기를 위한 클래스를 추가하고 attack()을 재정의하면 됩니다.

 

예를 들어, 총을 추가하면 다음과 같이 사용할 수 있습니다.

class Gun implements Weapon {
    @Override
    public void attack() {
        System.out.println("총 공격");
    }
} 


....
client.setWeapon(new gun());
client.attack();
...

인터페이스 Weapon이 들어가는 자리에 new gun()이라고 써주는 것만 하더라도, 총으로 무기가 바뀌었음을 알 수 있습니다.

 

* 참고

https://www.inflearn.com/course/%EC%9E%90%EB%B0%94-%EB%94%94%EC%9E%90%EC%9D%B8-%ED%8C%A8%ED%84%B4/lecture/3171?tab=note 

 

- 패스트캠퍼스 [한번에 끝내는 Java/Spring 웹 개발 마스터 초격차 패키지 Online] 전략 패턴 강의

반응형

'학습 > Java' 카테고리의 다른 글

SOLID 원칙  (0) 2021.08.01
POJO / Hibernate  (0) 2021.08.01
map vs flatMap  (0) 2021.05.16
JJWT  (1) 2021.03.03
Could not autowire. No beans of 'Mapper' type found  (0) 2021.03.02