Strategy 패턴(전략 패턴)
객체들이 할 수 있는 행위 각각에 대해서 전략 클래스를 생성하고, 유사한 행위들을 캡슐화 하는 인터페이스를 정의하여, 객체의 행위를 동적으로 바꾸고 싶은 경우 직접 행위를 수정하지 않고 전략을 바꿔주기만 함으로써 행위를 유연하게 확장할 수 있는 방법을 말한다.
객체가 할 수 있는 것들을 전략으로 두고, 동적으로 행위의 수정이 필요한 경우 전략을 바꾸는 것만으로 행위의 수정이 가능하도록 만든 패턴이다.
여러 알고리즘을 하나의 추상적인 접근점을 만들어 접근점에서 서로 교환 가능하도록 하는 패턴이라고 정의 할 수 있다.
1. 전략 패턴 사용 이유
예를 들어, 게임 캐릭터 클래스가 존재하고, 칼(Knife), 검(Sword), 도끼(Ax) 라는 클래스들이 있고, 이 클래스들은 Weapon 인터페이스를 구현했다고 해보자.
기본적으로 무기는 공격이라는 기능을 갖고있다.
코드로 표현하면 아래와 같다.
public interface Weapon {
void attack();
}
public class Knife implements Weapon{
@Override
public void attack() {
System.out.println("칼 공격");
}
}
public class Sword implements Weapon{
@Override
public void attack() {
System.out.println("검 공격");
}
}
public class Ax implements Weapon{
@Override
public void attack() {
System.out.println("도끼 공격");
}
}
공격을 하는데 칼, 검, 도끼 고유의 공격이 있다.
기본 공격은 없고 무기를 소유했을때만 지금처럼 공격이 존재하기 때문에
null을 처리해줘야 하므로 아무것도 들고 있지 않을 때 맨손 공격을 하도록 만들었다.
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();
}
}
}
캐릭터 라는 클래스에서 선언과 구현의 접근점을 만들어주고
무기를 세팅할수있게 setWeapon 메소드를 만들어 Weapon 인스턴스에 주입해준다.
구현만 했을때 무기를 장착해주지 않으면 nullpointerException
이 발생하기 때문에
null체크를 진행하여 Weapon인터페이스의 attack()
을 진행해준다.
Main.java
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();
}
}
전략패턴의 장점은 어떠한 요구사항이 추가가 되었을때, setWeapon 같이 인스턴스 주입만 해주게 되면 다른 조건도 바로 복잡하게
구성하지 않고 구현할 수 있기 때문에 추가삭제가 용이하다 라고 생각한다.
'디자인패턴' 카테고리의 다른 글
Facade Pattern 적용기 (0) | 2022.08.10 |
---|---|
[Java] 디자인 패턴 - Composite 패턴 (0) | 2022.08.03 |
[Java] 디자인 패턴 - 어댑터 패턴 (0) | 2022.08.03 |
[Java] 디자인 패턴 - 빌더 패턴 (0) | 2022.08.03 |