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

1. 스트래티지 패턴

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

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

 

2. 예제

2.1. 요구사항

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

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

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

 

2.2. 무기 만들기

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

 

<java />
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 하여 '공격'이란 행위를 구현

 

2.3. 게임 케릭터 만들기

<code />
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();

 

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

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

 

2.5. 응용

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

<java />
public class Ax implements Weapon { @Override public void attack() { System.out.println("도끼로 공격"); } }
<java />
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)를 유연하게 변경할 수 있음.

 

2.6. 예제 클래스 다이어그램

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

 

2.7. 예제의 핵심

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

memostack

@bluemiv_mm

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