아무거나

[Design Pattern] Strategy Pattern 본문

Java & Kotlin/Java

[Design Pattern] Strategy Pattern

전봉근 2019. 12. 7. 16:22
반응형

스트래티지 패턴(Strategy Pattern)

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

스트래티지 패턴 예시

[요구사항]

  • 신작 게임에서 캐릭터와 무기를 구현해보자.
  • 무기는 두 가지 종류가 있다.

먼저 무기 인터페이스를 생성한다. [Weapon.java]

package com.bkjeon.strategy;

public interface Weapon {
    public void attack();
}

그 다음 칼과 검의 클래스를 생성한다. [Knife.java]

package com.bkjeon.strategy;

public class Knife implements Weapon {

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

}

[Sword.java]

package com.bkjeon.strategy;

public class Sword implements Weapon {

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

}

마지막으로 무기를 사용할 캐릭터 클래스를 생성한다. [GameCharacter.java]

package com.bkjeon.strategy;

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

}

실행할 Main 클래스를 선언 [Main.java]

package com.bkjeon.strategy;

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.java]

package com.bkjeon.strategy;

public class Ax implements Weapon {

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

}

Main 클래스에서 도끼를 추가한다. [Main.java]

package com.bkjeon.strategy;

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

}

실행결과

맨손 공격
칼 공격
검 공격
도끼 공격

 

참고: 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/dashboard

반응형

'Java & Kotlin > Java' 카테고리의 다른 글

[Design Pattern] Factory Method Pattern  (0) 2019.12.07
[Design Pattern] Template Method Pattern  (0) 2019.12.07
[Design Pattern] Adapter Pattern  (0) 2019.12.07
[Design Pattern] Strategy Pattern  (0) 2019.10.27
iterator vs foreach  (0) 2019.08.17
Comments