[Java] 디자인 패턴 - Strategy 패턴

lsj8367·2021년 4월 8일
0

Strategy 패턴(전략 패턴)

객체들이 할 수 있는 행위 각각에 대해서 전략 클래스를 생성하고, 유사한 행위들을 캡슐화 하는 인터페이스를 정의하여, 객체의 행위를 동적으로 바꾸고 싶은 경우 직접 행위를 수정하지 않고 전략을 바꿔주기만 함으로써 행위를 유연하게 확장할 수 있는 방법을 말한다.

객체가 할 수 있는 것들을 전략으로 두고, 동적으로 행위의 수정이 필요한 경우 전략을 바꾸는 것만으로 행위의 수정이 가능하도록 만든 패턴이다.

여러 알고리즘을 하나의 추상적인 접근점을 만들어 접근점에서 서로 교환 가능하도록 하는 패턴이라고 정의 할 수 있다.

1. 전략 패턴 사용 이유

예를 들어, 게임 캐릭터 클래스가 존재하고, 칼(Knife), 검(Sword), 도끼(Ax) 라는 클래스들이 있고, 이 클래스들은 Weapon 인터페이스를 구현했다고 해보자.
기본적으로 무기는 공격이라는 기능을 갖고있다.

코드로 표현하면 아래와 같다.

public interface Weapon {
    void attack();
}
public class Knife implements Weapon{
    @Override
    public void attack() {
        System.out.println("칼 공격");
    }
}
public class Sword implements Weapon{
    @Override
    public void attack() {
        System.out.println("검 공격");
    }
}
public class Ax implements Weapon{
    @Override
    public void attack() {
        System.out.println("도끼 공격");
    }
}

공격을 하는데 칼, 검, 도끼 고유의 공격이 있다.
기본 공격은 없고 무기를 소유했을때만 지금처럼 공격이 존재하기 때문에
null을 처리해줘야 하므로 아무것도 들고 있지 않을 때 맨손 공격을 하도록 만들었다.

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

    //교환가능
    public void setWeapon(Weapon weapon){
        this.weapon = weapon;
    }

    public void attack() {
        if(weapon == null){
            System.out.println("맨손 공격");
        }else{
            //델리게이트(의존)
            weapon.attack();
        }
    }
}

캐릭터 라는 클래스에서 선언과 구현의 접근점을 만들어주고

무기를 세팅할수있게 setWeapon 메소드를 만들어 Weapon 인스턴스에 주입해준다.

구현만 했을때 무기를 장착해주지 않으면 nullpointerException이 발생하기 때문에
null체크를 진행하여 Weapon인터페이스의 attack()을 진행해준다.

Main.java

public class Main {
    public static void main(String[] args) {
        GameCharacter character = new GameCharacter();

        character.attack(); //맨손

        character.setWeapon(new Knife()); //칼
        character.attack();

        character.setWeapon(new Sword()); //검
        character.attack();

        character.setWeapon(new Ax()); //도끼
        character.attack();
    }
}

전략패턴의 장점은 어떠한 요구사항이 추가가 되었을때, setWeapon 같이 인스턴스 주입만 해주게 되면 다른 조건도 바로 복잡하게
구성하지 않고 구현할 수 있기 때문에 추가삭제가 용이하다 라고 생각한다.

profile
주니어 백엔드 개발자💻

0개의 댓글