๐ Study/Design Pattern
1. [์๋ฐ/Java] ์คํธ๋ํฐ์ง ํจํด(Strategy Pattern) : ์ ๋ต์ ์ฝ๊ฒ ๋ฐ๊ฟ ์ ์๋๋ก ํด์ฃผ๋ ๋์์ธ ํจํด(interface)
kongmi
2023. 1. 24. 14:18
ํด๋น ๋ด์ฉ์ ์๋ ๋ธ๋ก๊ทธ ํฌ์คํ ์ ์ฐธ์กฐํ์์ต๋๋ค.
https://memostack.tistory.com/58
Design Pattern - Strategy Pattern (์คํธ๋ํฐ์ง ํจํด)
์คํธ๋ํฐ์ง ํจํด ์ ๋ต์ ์ฝ๊ฒ ๋ฐ๊ฟ ์ ์๋๋ก ํด์ฃผ๋ ๋์์ธ ํจํด ํ์(Behavior)๋ค์ ์บก์ํํ์ฌ ๋์ ์ผ๋ก ์์ ๋กญ๊ฒ ๋ฐ๊ฟ ์ ์๋ ํจํด ์์ ์๊ตฌ์ฌํญ ๊ฒ์ ์ผ๋ฆญํฐ์ ๋ฌด๊ธฐ๋ฅผ ์์ฑํ์ฌ, ์ผ๋ฆญํฐ๊ฐ
memostack.tistory.com
์คํธ๋ํฐ์ง ํจํด?
- ์ ๋ต์ ์ฝ๊ฒ ๋ฐ๊ฟ ์ ์๋๋ก ํด์ฃผ๋ ๋์์ธ ํจํด
- ๋ฉ์๋๋ฅผ ์บก์ํํ์ฌ ๋์ ๋ฐ์ธ๋ฉ์ด ๊ฐ๋ฅํ๋๋ก ํด์ฃผ๋ ํจํด
์์
์๊ตฌ์ฌํญ
- ๊ฒ์ ์บ๋ฆญํฐ์ ๋ฌด๊ธฐ๋ฅผ ์์ฑํ์ฌ, ์บ๋ฆญํฐ๊ฐ ๋ฌด๊ธฐ๋ฅผ ์ฅ์ฐฉํ ์ ์์.
- ์บ๋ฆญํฐ๊ฐ ๋ค๊ณ ์๋ ๋ฌด๊ธฐ๋ ๋ณ๊ฒฝ์ด ์์ ๋ก์์ผ ํจ.
๋ฌด๊ธฐ ์ข ๋ฅ
- ์ด (Gun)
- ์นผ (Knife)
๋ฌด๊ธฐ ํ์
- ๊ณต๊ฒฉ (Attack)
๋ฌด๊ธฐ(Weapon) ๋ง๋ค๊ธฐ
public interface Weapon {
void attack();
}
- ๋ฌด๊ธฐ๋ผ๋ interface ์์ฑ, ๊ฐ ๋ฌด๊ธฐ๋ณ๋ก ๊ณต๊ฒฉํ๋ ๊ฒ์ด ๋ค๋ฅด๋ ์์ธํ ๊ตฌํ์ implementsํ์ฌ ์์ฑ
- ๋ฌด๊ธฐ๋ก ๊ณต๊ฒฉ์ ํ๊ธฐ์ํด
attack()
๋ฉ์๋ ์์ฑ
1. ์นผ(Knife)
public class Knife implements Weapon {
@Override
public void attack() {
System.out.println("์นผ๋ก ๊ณต๊ฒฉ!");
}
}
2. ์ด(Gun)
public class Gun implements Weapon {
@Override
public void attack() {
System.out.println("์ด์ผ๋ก ๊ณต๊ฒฉ!");
}
}
- ๋ฌด๊ธฐ๋ฅผ ๋ด์ ํด๋์ค(Knife, Gun)๋ Weapon ํด๋์ค๋ฅผ implementํ์ฌ
attack()
์ค๋ฒ๋ผ์ด๋ฉ - ๋ฌด๊ธฐ๋ฅผ ๋ด์ ํด๋์ค ์์ ํด๋นํ๋ ๋ฌด๊ธฐ์
attack()
๋ฉ์๋ ๊ตฌํ
๊ฒ์ ์บ๋ฆญํฐ ๋ง๋ค๊ธฐ
public class Character {
private Weapon weapon;
public void setWeapon(Weapon weapon) {
this.weapon = weapon;
}
public void attack() {
weapon.attack();
}
}
- ๋ฌด๊ธฐ๋ฅผ ์ฌ์ฉํ ์บ๋ฆญํฐ ์์ฑ
weapon
์ด๋ ์ ๊ทผ์ ์ ๋ง๋ค๊ณ ,setWeapon()
์ด๋ ๊ตํ ๊ฐ๋ฅํ๋๋ก ํ๋ค.- ๊ทธ๋ฆฌ๊ณ
attack()
์ด๋ ๋ฉ์๋๋ฅผ ๋ง๋ค๊ณ , ๊ตฌํ ๋ด์ฉ์weapon
์๊ฒ ์์ํ๋ค.
weapon.attack();
Main
public class Main {
public static void main(String[] args) {
final Character knifeMan = new Character();
final Character gunMan = new Character();
final Weapon knife = new Knife();
final Weapon gun = new Gun();
knifeMan.setWeapon(knife);
gunMan.setWeapon(gun);
knifeMan.attack();
gunMan.attack();
}
}
์นผ์ก์ด(knifeMan)
๊ณผ์ด์ก์ด(gunMan)
๊ฐ์ฒด ์์ฑsetWeapon()
์ ์ด์ฉํ์ฌ '์นผ์ก์ด'์๊ฒ๋ '์นผ'์, '์ด์ก์ด'์๊ฒ๋ '์ด'์ ๋ฌด๊ธฐ๋ก ์ฅ์ด์ค๋ค.attack()
์ ์ด์ฉํ์ฌ ๊ณต๊ฒฉํ๋ค.
โ '๋ฌด๊ธฐ'๋ ์ ๋ต(Strategy)์ ๊ตฌํํจ.
โ '์ด', '์นผ'์ ์บก์ํํ๊ณ ,setWeapon()
์ผ๋ก ์ ๋ต์ ์ฝ๊ฒ ๋ณ๊ฒฝํ ์ ์๊ฒ ํจ.
=> ๋ฌด๊ธฐ๊ฐ ์ถ๊ฐ๋๊ฑฐ๋ ๋ณ๊ฒฝ๋์ด๋setWeapon()
์ ๋ชฐ๋ผ๋ ๋จ.
์นผ๋ก ๊ณต๊ฒฉ!
์ด์ผ๋ก ๊ณต๊ฒฉ!