μ€νΈλν°μ§ ν¨ν΄(Strategy Pattern)
μ λ΅ ν¨ν΄μ΄λ λΉμ·ν λμμ νμ§λ§ λ€λ₯΄κ² ꡬνλμ΄ μλ νμ(μ λ΅)λ€μ 곡ν΅μ μΈν°νμ΄μ€λ₯Ό μμλ°λ κ°κ°μ ν΄λμ€λ‘ ꡬννκ³ λμ μΌλ‘ λ°κΏ μ μλλ‘ νλ ν¨ν΄μ΄λ€. μ λ΅ ν¨ν΄μΌλ‘ ꡬνλ μ½λλ μ§μ νμμ λν μ½λλ₯Ό μμ ν νμ μμ΄ μ λ΅λ§ λ³κ²½νμ¬ μ μ°νκ² νμ₯ν μ μκ² λλ€.
1. ꡬν
λ§μ½ μ λ΅ ν¨ν΄μ μ¬μ©νμ§ μλλ€λ©΄, λ¨μν if-elseλ₯Ό μ¬μ©νμ¬ κ΅¬νν΄μΌ νλ©° κ²μμ΄ μ λ°μ΄νΈλμ΄ μ§μ μ΄ μΆκ°λκ±°λ μμ μ΄ νμνλ€λ©΄ attack() λ©μλλ₯Ό μμ ν΄μΌ ν κ²μ΄λ€.
class Character {
private final String job;
Character(String job) {
this.job = job;
}
void attack() {
if (job.equals("warrior")) {
System.out.println("컀λ€λ λκ²μ νλλ₯Έλ€!");
} else if (job.equals("thief")) {
System.out.println("μμ λ¨λλ‘ λΉ λ₯΄κ² λλ² μ°λ₯Έλ€!");
} else if (job.equals("magician")) {
System.out.println("νμ΄μ΄λ³Όμ λ°μ¬νλ€!");
}
}
}
μ΄μ κ°μ ꡬ쑰λ κΈ°λ₯μ νμ₯νκΈ° μν΄μλ μμ μ΄ νμν ꡬ쑰μ΄λ€. μ΄λ κ°μ²΄μ§ν₯ μ€κ³μ SOLID μ€ κ°λ°©-νμ μμΉ(OCP: Open-Closed Principle)μ μλ°°μ΄λ€. μ΄λ₯Ό μ λ΅ ν¨ν΄μ μ¬μ©νμ¬ κ°λ°-νμ μμΉμ λ°λ₯΄λ κ΅¬μ‘°λ‘ κ°μ ν΄ λ³΄μ.
μ λ΅ ν¨ν΄μ μ¬μ©νκΈ° μν΄μλ μ λ΅μ λν μΈν°νμ΄μ€λ₯Ό λ¨Όμ ꡬνν΄μΌ νλ€. μμ μ½λμ μ μ©ν΄ 보μλ©΄ 곡격 λ©μμ§λ₯Ό λ°ννλ getAttackMessage λ©μλλ₯Ό κ°λ AttackStrategy μΈν°νμ΄μ€λ₯Ό μ μνκ³ κ° μ§μ λ³ μ λ΅μ ν΄λμ€λ‘ ꡬννλ©΄ λλ€.
interface AttackStrategy {
String getAttackMessage();
}
class WarriorAttackStrategy implements AttackStrategy {
public String getAttackMessage() {
return "컀λ€λ λκ²μ νλλ₯Έλ€!";
}
}
class ThiefAttackStrategy implements AttackStrategy {
public String getAttackMessage() {
return "μμ λ¨λλ‘ λΉ λ₯΄κ² λλ² μ°λ₯Έλ€!";
}
}
class MagicianAttackStrategy implements AttackStrategy {
public String getAttackMessage() {
return "νμ΄μ΄λ³Όμ λ°μ¬νλ€!";
}
}
class ArcherAttackStrategy implements AttackStrategy {
public String getAttackMessage() {
return "νμ λ°μ¬νλ€!";
}
}
κΈ°μ‘΄ if-elseλ‘ κ΅¬ννλ Character ν΄λμ€λ μλμ κ°μ΄ λ³κ²½λλ€. Characterμ μΈμ€ν΄μ€κ° μμ±λ λ μΈμλ₯Ό ν΅ν΄ μΈλΆλ‘λΆν° μ λ΅μ μ£Όμ λ°κ³ , attack λ©μλμμλ AttackStrategy μΈν°νμ΄μ€κ° μ 곡νλ getAttackMessageλ₯Ό νΈμΆνμ¬ κ³΅κ²© λ©μμ§λ₯Ό λ°μμ¬ μ μλ€. μ΄λ₯Ό μμ‘΄μ± μ£Όμ (Dependency Injection)μ΄λΌκ³ νλ€.
class Character {
private final AttackStrategy attackStrategy;
Character(AttackStrategy attackStrategy) {
this.attackStrategy = attackStrategy;
}
void attack() {
System.out.println(attackStrategy.getAttackMessage());
}
}
μ΄λ κ² κ°μ λ μ€κ³μμλ μλ‘μ΄ μ§μ κ΅°μ΄ μΆκ°λλ€κ³ ν΄λ Character ν΄λμ€μ μ½λλ μμ ν νμκ° μκ² λλ€. μ΄μ μλ ν΄μ μ΄λΌλ μλ‘μ΄ μ§μ κ΅°μ΄ μΆκ°λλ€κ³ ν΄λ³΄μ. κ·Έλ λ€λ©΄ μλμ μ λ΅ ν΄λμ€λ§ μλ‘ μΆκ°νλ©΄ λλ€.