๐Ÿ“š 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()์€ ๋ชฐ๋ผ๋„ ๋จ.
์นผ๋กœ ๊ณต๊ฒฉ!
์ด์œผ๋กœ ๊ณต๊ฒฉ!