μŠ€νŠΈλž˜ν‹°μ§€ νŒ¨ν„΄(Strategy Pattern)

2023. 5. 19. 22:19Β·πŸ“ Computer Science/✏ Design Pattern

μŠ€νŠΈλž˜ν‹°μ§€ νŒ¨ν„΄(Strategy Pattern)

μ „λž΅ νŒ¨ν„΄μ΄λž€ λΉ„μŠ·ν•œ λ™μž‘μ„ ν•˜μ§€λ§Œ λ‹€λ₯΄κ²Œ κ΅¬ν˜„λ˜μ–΄ μžˆλŠ” ν–‰μœ„(μ „λž΅)듀을 κ³΅ν†΅μ˜ μΈν„°νŽ˜μ΄μŠ€λ₯Ό μƒμ†λ°›λŠ” 각각의 클래슀둜 κ΅¬ν˜„ν•˜κ³  λ™μ μœΌλ‘œ λ°”κΏ€ 수 μžˆλ„λ‘ ν•˜λŠ” νŒ¨ν„΄μ΄λ‹€. μ „λž΅ νŒ¨ν„΄μœΌλ‘œ κ΅¬ν˜„λœ μ½”λ“œλŠ” 직접 ν–‰μœ„μ— λŒ€ν•œ μ½”λ“œλ₯Ό μˆ˜μ •ν•  ν•„μš” 없이 μ „λž΅λ§Œ λ³€κ²½ν•˜μ—¬ μœ μ—°ν•˜κ²Œ ν™•μž₯ν•  수 있게 λœλ‹€.

 

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 ν΄λž˜μŠ€μ˜ μ½”λ“œλŠ” μˆ˜μ •ν•  ν•„μš”κ°€ μ—†κ²Œ λœλ‹€. μ΄μ„ μ˜λŠ” ν•΄μ μ΄λΌλŠ” μƒˆλ‘œμš΄ μ§μ—…ꡰ이 μΆ”κ°€λœλ‹€κ³  ν•΄λ³΄μž. κ·Έλ ‡λ‹€λ©΄ μ•„λž˜μ˜ μ „λž΅ ν΄λž˜μŠ€λ§Œ μƒˆλ‘œ μΆ”κ°€ν•˜λ©΄ λœλ‹€.

 

2. μ°Έκ³ 

https://hudi.blog/strategy-pattern/

 

μ „λž΅ νŒ¨ν„΄ (Strategy Pattern)

μ„œλ‘  μš°μ•„ν•œν…Œν¬μ½”μŠ€ 레벨1 첫번째 λ―Έμ…˜μΈ μžλ™μ°¨ κ²½μ£Όλ₯Ό κ΅¬ν˜„ν•˜λ©°, 'λžœλ€κ°’μ„ μ‚¬μš©ν•˜λŠ” λ©”μ„œλ“œμ— λŒ€ν•œ ν…ŒμŠ€νŠΈλŠ” μ–΄λ–»κ²Œ ν•˜λ©΄ μ’‹μ„κΉŒ?' 에 λŒ€ν•œ 고민을 ν–ˆλ‹€. 결둠적으둜 RandomGeneratable μΈν„°νŽ˜μ΄

hudi.blog

μ €μž‘μžν‘œμ‹œ (μƒˆμ°½μ—΄λ¦Ό)
'πŸ“ Computer Science/✏ Design Pattern' μΉ΄ν…Œκ³ λ¦¬μ˜ λ‹€λ₯Έ κΈ€
  • μ»΄ν¬μ§€νŠΈ νŒ¨ν„΄(Composite Pattern)
  • [κ²Œμž„ ν”„λ‘œκ·Έλž˜λ° νŒ¨ν„΄] κ²Œμž„ κ°œλ°œμ—μ„œ μ‚¬μš©λ˜λŠ” λ””μžμΈ νŒ¨ν„΄
  • [κ²Œμž„ ν”„λ‘œκ·Έλž˜λ° νŒ¨ν„΄] 더티 ν”Œλž˜κ·Έ νŒ¨ν„΄(Dirty Flag Pattern)
  • [κ²Œμž„ ν”„λ‘œκ·Έλž˜λ° νŒ¨ν„΄] κ²Œμž„ 루프 νŒ¨ν„΄(Game Loop Pattern)
Blxxming
Blxxming
CS 지식과 κ³΅λΆ€ν•˜λ‹€ 배운 것, κ²½ν—˜ν•œ 것 등을 κΈ°λ‘ν•˜λŠ” λΈ”λ‘œκ·Έμž…λ‹ˆλ‹€.
  • Blxxming
    πŸ’‘λ²ˆλœ©πŸ’‘
    Blxxming
  • 전체
    였늘
    μ–΄μ œ
  • 곡지사항

    • Tech Interview
    • πŸ“š Tech (246)
      • πŸ“ Computer Science (96)
        • ✏ OS (12)
        • ✏ Network & Web (10)
        • ✏ Database (11)
        • ✏ Data Structure (6)
        • ✏ Algorithm (40)
        • ✏ Design Pattern (9)
        • ✏ Cloud Computing (3)
        • ✏ (5)
      • πŸ“ Language (73)
        • ✏ Language (6)
        • ✏ C & C++ (11)
        • ✏ C# (19)
        • ✏ JAVA (37)
      • πŸ“ Game (43)
        • ✏ Computer Graphics (2)
        • ✏ Unity (14)
        • ✏ Unreal (26)
        • ✏ (1)
      • πŸ“ Book (34)
        • ✏ Effective (3)
        • ✏ Game Server (16)
        • ✏ Clean Code (14)
        • ✏ (1)
  • hELLOΒ· Designed Byμ •μƒμš°.v4.10.0
Blxxming
μŠ€νŠΈλž˜ν‹°μ§€ νŒ¨ν„΄(Strategy Pattern)
μƒλ‹¨μœΌλ‘œ

ν‹°μŠ€ν† λ¦¬νˆ΄λ°”