본문 바로가기
Programming/디자인 패턴

스트래티지 패턴 (Strategy)

by Teshub 2021. 1. 28.

-정의-

알고리즘(이하 로직)을 정의하고 각각을 캡슐화하여 교환해서 사용할 수 있도록 만든다. 스트래티지 패턴을 활용하면 로직을 사용하는 클라이언트와는 독립적으로 로직을 변경할 수 있다. 

 

예시(해당 예시는 헤드퍼스트 디자인 패턴 책에 나온 예시이다)

무기를 인터페이스로 만든다

그 후 무기를 쓰는 구체적 행위를 구현 클래스에서 따로 정의한다

Character추상클래스에서는 각각의 직업이 상속받는다

기사는 검을 쓰지만 활을 쓸수도 있습니다

무기의 교체가 일어날 수 있기 때문에 모든 기사 클래스에서 모든 무기의 사용법을 구현하는 것은 비효율적입니다

이렇게 특정하게 변경을 해야 할 경우 단지 인터페이스의 구현 클래스를 새로 끼우는 방식으로 수정이 가능한 것이 이 패턴의 큰 장점입니다

 

예시 코드입니다

//먼저 캐릭터 추상클래스를 만듭니다
public abstract class Character {

    WeaponBehavior weapon;

    public abstract void fight();

    //무기의 인터페이스구현클래스를 동적으로 교체하기위해 작성합니다
    public void setWeapon(WeaponBehavior w){
        this.weapon = w;
        };
}


public class Knight extends Character{
    @Override
    public void fight() {
        weapon.useWeapon();
    }
}


//무기 인터페이스
public interface WeaponBehavior {
    void useWeapon();
}



public class SwordBehavior implements WeaponBehavior{
    @Override
    public void useWeapon() {
        System.out.println("검으로 찌르다");
    }
}



public class bowBehavior implements WeaponBehavior {
    @Override
    public void useWeapon() {
        System.out.println("활을 쏘다");
    }
}

 

만약 기사가 검을 쓰다 활을 써야 할 경우를 가정해보겠습니다

실행 예시 코드입니다

public class Main {
    public static void main(String[] args) {
    
        Knight k = new Knight();
		
        //기사가 검을 쓸때
        System.out.println("검 사용");
        k.setWeapon(new SwordBehavior());
        k.fight();
        
        //기사가 활을 쓸때
        System.out.println("활 사용");
        k.setWeapon(new bowBehavior());
        k.fight();

    }
}

 

검을 사용 시엔 무기 인터페이스 중 검을 구현하는 클래스를 넣습니다

활을 사용 시엔 무기 인터페이스 중 활을 구현하는 클래스를 넣습니다

 

실행 코드입니다

이처럼 변화가 되는 것을 인터페이스로 선언 후 구현 클래스를 작성합니다

메인클래스나 실행클래스에서는 인터페이스 선언 후 구현 클래스를 교체하여 사용하는 것이 핵심입니다

 

여담으로 처음 스프링을 배울 때 이 패턴을 몰라 왜 인터페이스로 선언 후 구현 클래스를 교체하는지 몰라서 헤맷던 기억이 있습니다 디자인 패턴을 알고 스프링에 들어 갓으면 훨씬 좋았겠다는 생각이 드네요

 

다음 포스팅은 옵서버 패턴입니다

 

참고서적 : Head First Design Patterns

꼭 사세요 두 번 사세요

 

책을 참고하였지만 직접내용을 치고 구현한 것이라 오류나 오탈자가 있을 수 있습니다.

틀린 내용 있을 시 덧글에 적어주시면 참고하여 수정하겠습니다 감사합니다.

728x90

댓글