memostack
article thumbnail
블로그를 이전하였습니다. 2023년 11월부터 https://bluemiv.github.io/에서 블로그를 운영하려고 합니다. 앞으로 해당 블로그의 댓글은 읽지 못할 수 도 있으니 양해바랍니다.
반응형

스트래티지 패턴

  • 전략을 쉽게 바꿀 수 있도록 해주는 디자인 패턴

  • 행위(Behavior)들을 캡슐화하여 동적으로 자유롭게 바꿀 수 있는 패턴

 

예제

요구사항

게임 케릭터와 무기를 생성하여, 케릭터가 무기를 쥘 수 있음.

  • 무기의 종류
    • 칼 (Sword)
    • 총 (Gun)
  • 무기의 행위
    • 공격 (Attack)

케릭터가 들고 있는 무기는 변경이 자유롭게 가능해야 함.

 

무기 만들기

public interface Weapon {
    void attack();
}
  • 무기(Weapon)라는 인터페이스를 생성. (자세한 내용은 implements하여 구현)
  • 무기로 공격(attack)을 할 수 있으므로, attack()이라는 메소드를 생성

 

public class Knife implements Weapon {

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

    @Override
    public void attack() {
        System.out.println("총으로 공격");
    }
}
  • 검과 총을 생성
  • 각 클래스는 attack()override 하여 '공격'이란 행위를 구현

 

게임 케릭터 만들기

public class Character {
    private Weapon weapon;

    public void setWeapon(Weapon weapon) {
        this.weapon = weapon;
    }

    public void attack() {
        weapon.attack();
    }
}
  • 무기를 사용할 케릭터를 구현
  • weapon이란 접근점을 만들고, setWeapon()이란 교환 가능하도록 한다.
  • 그리고 attack()이란 메소드를 만들고, 구현 내용은 weapon에게 위임(deligate)한다.
    • waepon.attack();

 

구현한 Strategy 를 사용하여 게임 케릭터 구현

public class Main {

    public static void main(String[] args) {
        final Character swordMan = new Character();
        final Character shooter = new Character();

        final Weapon knife = new Knife();
        final Weapon gun = new Gun();
        swordMan.setWeapon(knife);
        shooter.setWeapon(gun);

        swordMan.attack();
        shooter.attack();
    }
}
칼로 공격
총으로 공격
  • 검사(swordMan)와 사수(shooter)를 만든다.
  • setWeapon()을 이용하여, '검사'에게는 '검'을, '사수'에게는 '총'을 무기로 쥐어준다.
  • attack() 메소드로 공격을 한다.

 

응용

더 나아가 게임에 도끼(Ax)란 무기가 업데이트되어 검사가 사용할 수 있게 되었다면

public class Ax implements Weapon {

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

    public static void main(String[] args) {
        final Character swordMan = new Character();
        final Character shooter = new Character();

        final Weapon knife = new Knife();
        final Weapon gun = new Gun();
        swordMan.setWeapon(knife);
        shooter.setWeapon(gun);

        swordMan.attack();
        shooter.attack();

        // 새로운 무기 '도끼'로 공격
        final Weapon ax = new Ax();
        swordMan.setWeapon(ax);
        swordMan.attack();
    }
}
  • 전략 패턴(Strategy Pattern)으로 행위(Behavior)를 유연하게 변경할 수 있음.

 

예제 클래스 다이어그램

인텔리제이 클래스 다이어그램

 

예제의 핵심

  • '무기'란 전략(Strategy)을 구현 함.
  • '총', '검', '도끼'들을 캡슐화하고, setWeapon()으로 전략을 쉽게 변경할 수 있게 함.
반응형
블로그를 이전하였습니다. 2023년 11월부터 https://bluemiv.github.io/에서 블로그를 운영하려고 합니다. 앞으로 해당 블로그의 댓글은 읽지 못할 수 도 있으니 양해바랍니다.
profile

memostack

@bluemiv_mm

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!