개발/Design pattern

[Design Pattern] Strategy Pattern

도리 🐟 2021. 4. 8. 22:58

μž‘μ„±μΌ: 2018.01.22


Strategy pattern

일λͺ…, μ „λž΅νŒ¨ν„΄

λͺ©μ 

  • 각각을 μΊ‘μŠν™”ν•˜μ—¬ λ³€ν™” κ°€λŠ₯ν•˜κ²Œ λ§Œλ“  μ•Œκ³ λ¦¬μ¦˜μ˜ 집합을 μ •μ˜ν•œλ‹€.
  • μΈν„°νŽ˜μ΄μŠ€μ— 좔상 λ©”μ†Œλ“œλ₯Ό μ •μ˜ν•˜κ³ , μžμ„Έν•œ κ΅¬ν˜„μ€ νŒŒμƒλœ ν΄λž˜μŠ€μ— ν•œλ‹€.
  • Strategy νŒ¨ν„΄μ€ μ•Œκ³ λ¦¬μ¦˜μ΄ 그것을 μ‚¬μš©ν•˜λŠ” ν΄λΌμ΄μ–ΈνŠΈμ™€ λ…λ¦½μ μœΌλ‘œ λ³€ν™”ν•  수 있게 ν•΄μ€€λ‹€. βž” OCP
OCP(Open-Closed Principle;개방 폐쇄 원칙) ν™•μž₯μ—λŠ” μ—΄λ €μžˆκ³ , μˆ˜μ •μ—λŠ” λ‹«ν˜€ μžˆμ–΄μ•Ό ν•œλ‹€λŠ” 객체 지ν–₯ ν”„λ‘œκ·Έλž˜λ°μ˜ 핡심 원칙

ν•΄κ²°ν•  수 μžˆλŠ” 문제

ν΄λΌμ΄μ–ΈνŠΈλŠ” 변화와 κ΄€λ ¨ν•΄μ„œ 신경쓰지 μ•Šμ•„μ•Ό ν•œλ‹€.
βž” νŒŒμƒλœ 클래슀 μˆ˜κ°€ λ³€ν–ˆμ„ 경우, νŒŒμƒλœ 클래슀의 κ΅¬ν˜„μ΄ λ°”λ€Œμ—ˆμ„ κ²½μš°μ— λŒ€ν•œ 영ν–₯이 μ—†μ–΄μ•Ό ν•œλ‹€.

ꡬ쑰

2가지 κ΅¬ν˜„ 방법

  1. Abstract base class
    Interface entity(μœ„ κ΅¬μ‘°μ—μ„œμ˜ Interface)λ₯Ό abstract base class둜 λ‚˜νƒ€λ‚Έλ‹€.
    βž” 상속 계측이 λ™μ μΈ λ‹€ν˜•μ„±μ„ λ‚˜νƒ€λ‚Έλ‹€.

  2. ν΄λΌμ΄μ–ΈνŠΈμ— μ˜ν•œ method signature(method name + parameters) 예츑
    βž” 이 경우 Interface entityλŠ” ν΄λΌμ΄μ–ΈνŠΈμ—μ„œ template codeκ°€ 되고, 상속 계측은 정적인 λ‹€ν˜•μ„±μ„ λ‚˜νƒ€λ‚Έλ‹€.
     (이 방법은 잘 λͺ¨λ₯΄κ² μŒ.. λ‹€μ‹œ μ°Ύμ•„λ³Ό 것)

예제

μ½”λ“œ 예제둜 μ„€λͺ…이 잘 λ˜μ–΄μžˆλŠ” κΈ€
(Abstract base class λ°©λ²•μœΌλ‘œ κ΅¬ν˜„ν•œ 예제)

λ‹€λ₯Έ νŒ¨ν„΄λ“€κ³Όμ˜ 비ꡐ

  • Strategy νŒ¨ν„΄μ€ μƒμ„Έν•˜κ²Œ λ‚˜λˆ„λŠ” 정도λ₯Ό μ œμ™Έν•˜λ©΄ Template-method νŒ¨ν„΄κ³Ό λΉ„μŠ·ν•˜λ‹€.

  • State, Strategy, Bridge νŒ¨ν„΄μ€ λΉ„μŠ·ν•œ ꡬ쑰λ₯Ό κ°€μ§€μ§€λ§Œ λͺ©μ μ€ λͺ¨λ‘ λ‹€λ₯΄λ‹€. 
    βž” 즉, 각각 λ‹€λ₯Έ 문제λ₯Ό ν•΄κ²°ν•˜κΈ° μœ„ν•œ 방법
  • Strategy νŒ¨ν„΄μ˜ 첫번째 κ΅¬ν˜„ 방법(Abstract base class)은 State νŒ¨ν„΄κ³Ό μœ μ‚¬ν•˜λ‹€. 
    • 차이점: Strategy νŒ¨ν„΄μ€ ν•œλ²ˆ λ°”μΈλ”©λ˜κ³ , State νŒ¨ν„΄μ€ λ™μ μœΌλ‘œ μ—¬λŸ¬λ²ˆ λ°”μΈλ”©λœλ‹€.
    βž” Strategy νŒ¨ν„΄μ΄ μ’€ 더 가볍닀고 ν•  수 μžˆλ‹€.

[Reference]
Design Patterns Explained Simply - Alexander Shvets
http://jdm.kr/blog/54
http://www.bitesizedcsharp.com/

'개발 > Design pattern' μΉ΄ν…Œκ³ λ¦¬μ˜ λ‹€λ₯Έ κΈ€

[Design Pattern] Observer Pattern  (0) 2021.04.08