Strategy Pattern

김남건·2021년 7월 31일
0

Design Pattern

목록 보기
1/3
post-thumbnail

인터페이스(Interface)

사전적인 의미로는 키보드, 디스플레이 등과 같이 사람과 컴퓨터를 연결하는 장치이다.

Java에서는 인터페이스의 역할이 크게 두가지이다.

기능(메서드)의 선언과 구현의 분리

public interface Ainterface {
    public void funcA(); // 선언
}

public class AinterfaceImpl implements Ainterface{
    @Override
    public void funcA() {
        System.out.println("AAA"); // 구현
    }
}

기능(메서드)의 사용 통로

인터페이스 타입을 가진 변수의 경우, 해당 인터페이스를 구현한 클래스의 인스턴스로 값을 초기화할 수 있다. 그리고 해당 변수를 통하여 인터페이스의 메서드를 호출할 수 있다.

이렇게 인터페이스는 메서드를 사용하기 위한 통로가 되어준다.

public class Main {
    public static void main(String[] args) {
        Ainterface ainterface = new AinterfaceImpl();
        ainterface.funcA(); // AAA
    }
}

위임(Delegation)

한 객체가 기능 구현에 대한 책임을 다른 객체로 넘겨주는 것을 말한다.

public class AObj {
    Ainterface ainterface;
    public AObj(){
        ainterface = new AinterfaceImpl();
    }

    public void funcAA(){
        // Ainterface를 구현하는 클래스에서 필요한 기능을 구현하면 됨
        ainterface.funcA();
        ainterface.funcA();
    }
}

Strategy Pattern란?

여러 알고리즘을 하나의 추상적인 접근점을 만들어 접근점에서 서로 교환하도록 하는 패턴을 말한다.

예시

다음 그림을 보자.

중심에 Strategy라는 인터페이스가 있다. Client는 Strategy 타입을 가진 strategy라는 필드를 소유하고 있다. 그리고 Strategy를 구현한 클래스인 세 개의 클래스가 있다. client는 setStrategy 함수를 통하여 strategy를 세 개의 클래스 중 하나로 설정할 수 있다.

즉, client는 전략을 세 가지 중 하나를 골라 선택하고, 나중에 기존의 전략을 다른 전략으로 바꿀 수 있는 것이다.

구현

어떤 게임에서 캐릭터와 무기를 구현해야 하는데 무기는 칼과 검 두가지가 있다. 캐릭터는 무기를 둘 중 하나로 설정할 수가 있다.

우선 캐릭터가 무기에 접근하기 위한 접근점 역할을 하는 Weapon 인터페이스를 구현한다.

public interface Weapon {
    public void attack();
}

그 다음 각 무기에 해당하는 Knife, Sword 클래스를 선언한다.

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

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

그 다음 캐릭터에 해당하는 GameCharacter 클래스를 만든다. attack 함수의 경우, attack의 기능 구현의 책임을 다른 클래스에 위임하였다.

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(); // 위임
    }
}

다음 코드를 실행해 보면, 게임이 잘 구현된 것을 확인할 수 있다.

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(); // 검 공격
    }
}

유지 보수

도끼가 새로운 무기로 추가된다.

Ax라는 새로운 클래스를 만든다.

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

그러면 도끼도 정상적으로 사용된다. 다음과 같이 클래스를 하나만 추가해주면 유지보수도 쉽게 할 수가 있다.

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(); // 검 공격
    }
}

Reference

https://www.youtube.com/watch?v=UEjsbd3IZvA&t=1002s

0개의 댓글