블로그를 이전하였습니다. 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()으로 전략을 쉽게 변경할 수 있게 함.
반응형
'Study > Design Pattern' 카테고리의 다른 글
Design Pattern - Factory Method Pattern (팩토리 메소드 패턴) (0) | 2020.06.07 |
---|---|
Design Pattern - Template Method Pattern (템플릿 메소드 패턴) (0) | 2020.06.07 |