- 전략 패턴?
- 사용 이유
- 구현
사람(User
)과 복싱(Boxing
), 태권도(Taekwondo
)로 예를 들어보자.
public interface Fighting {
void fight();
}
public class Boxing implements Fighting {
@Override
public void fight() {
System.out.println("주먹으로 싸우다.");
}
}
public class Taekwondo implements Fighting {
@Override
public void fight() {
System.out.println("발차기로 싸우다.");
}
}
public class User {
public static void main(String args[]){
Fighting boxing = new Boxing();
Fighting taekwondo = new Taekwondo();
boxing.fight();
taekwondo.fight();
}
}
복싱은 주먹을 사용하여 싸우고, 태권도는 발차기를 사용하여 싸운다.
시간이 흘러 태권도에서도 주먹을 사용할 수 있을 때,
public class Taekwondo implements Fighting {
@Override
public void fight() {
System.out.println("주먹으로 싸우다.");
}
}
Taekwondo.fight()
를 직접 수정문제 상황
fight()
를 변경해야 한다.문제 상황을 해결하기 위해 전략 패턴을 사용하자
구현 방법
전략
public interface FightStrategy {
void fight();
}
public class Funch implements FightStrategy {
@Override
public void fight() {
System.out.println("주먹으로 싸우다.");
}
}
public class Kick implements FightStrategy {
@Override
public void fight() {
System.out.println("발차기로 싸우다.");
}
}
경기 방식
public class Play {
private FightStrategy fightStrategy;
public void fight() {
fightStrategy.fight();
}
public void setFightStrategy(FightStrategy fightStrategy) {
this.fightStrategy = fightStrategy;
}
}
public class Boxing extends Play {
}
public class Taekwondo extends Play {
}
유저
public class User {
public static void main(String args[]){
Play boxing = new Boxing();
Play taekwondo = new Taekwondo();
/**
* 기존에 복싱은 주먹만을 사용하고,
* 태권도는 발차기만을 사용한다.
*/
boxing.setFightStrategy(new Funch());
taekwondo.setFightStrategy(new Kick());
System.out.print("복싱 : ");
boxing.fight();
System.out.print("태권도 : ");
taekwondo.fight();
/**
* 추후, 태권도가 주먹을 사용한다.
*/
taekwondo.setFightStrategy(new Funch());
System.out.println("******태권도가 주먹을 사용하게 된 후*******");
System.out.print("복싱 : ");
boxing.fight();
System.out.print("태권도 : ");
taekwondo.fight();
}
}