🐰JAVA/Design Pattern

Strategy Pattern

🐢 개발개발 🐾 2022. 7. 6. 02:09

ν•„μš”μ„± 

λ¨Όμ € Strategy Pattern을 μ™œ μ‚¬μš©ν•΄μ•Όν•˜λŠ”μ§€μ— λŒ€ν•΄ 예λ₯Ό λ“€μ–΄ μ•Œμ•„λ³΄κ² μŠ΅λ‹ˆλ‹€.

 

λ‘œλ΄‡(Robot) 섀계도에 따라 μ•„ν†°(Atom)κ³Ό νƒœκΆŒλΈŒμ΄(TaekwonV)λ₯Ό λ§Œλ“€μ—ˆμŠ΅λ‹ˆλ‹€.

 

 

νƒœκΆŒλΈŒμ΄μ™€ 아톰은 κ³΅ν†΅μ μœΌλ‘œ 곡격과 이동 κΈ°λŠ₯이 μžˆμ§€λ§Œ κ΅¬ν˜„ν•˜λŠ” 방법은 λ‹€λ₯΄κΈ° λ•Œλ¬Έμ— λ‘œλ΄‡ ν΄λž˜μŠ€μ—μ„œ attack와 moveλ©”μ„œλ“œλ₯Ό μΆ”μƒλ©”μ„œλ“œλ‘œ μ„€μ •ν•΄ μžμ‹ ν΄λž˜μŠ€μ—μ„œ μ •μ˜ν•˜λ„λ‘ ν–ˆμŠ΅λ‹ˆλ‹€.

 

  곡격 이동
νƒœκΆŒλΈŒμ΄ 미사일 곡격 κ±·κΈ°
μ•„ν†° μ£Όλ¨Ή 곡격 ν•˜λŠ˜ λ‚ μ•„λ‹€λ‹ˆκΈ°

 

κ·ΈλŸ¬λ‹€ ν•˜λŠ˜λ‘œ λ‚ μ•„λ‹€λ‹ˆλ˜ 아톰이 κ°‘μžκΈ° 걷기만 κ°€λŠ₯ν•˜λ‹€κ³  ν•©λ‹ˆλ‹€. μ•„ν†°μ˜ move() λ©”μ„œλ“œλ₯Ό μˆ˜μ •ν•΄μ£ΌκΈ°λ§Œ ν•˜λ©΄ λ©λ‹ˆλ‹€.

 

μ—¬κΈ°μ„œ 문제점이 λ°œμƒν•©λ‹ˆλ‹€.

 

 

직접 move( )λ©”μ„œλ“œλ₯Ό μˆ˜μ •ν•˜λŠ” μž‘μ—…μ€ OCP (Open/Close Principle)에 μœ„λ°°λ˜λŠ” μž‘μ—…λ‹ˆλ‹€. 그리고 아톰이 걷기만 κ°€λŠ₯ν•˜κ²Œ 되면 νƒœκΆŒλΈŒμ΄μ™€ move()λ©”μ„œλ“œ λ‚΄μš©μ΄ μ€‘λ³΅λ©λ‹ˆλ‹€. λ”°λΌμ„œ μ€‘λ³΅λ˜λŠ” μ½”λ“œκ°€ λ°œμƒν•˜κ²Œ λ©λ‹ˆλ‹€. 

 

λ˜ν•œ μƒˆλ‘œμš΄ λ‘œλ΄‡μ„ μΆ”κ°€ κ΅¬ν˜„ν•΄μ•Όν•˜λŠ” 경우, κΈ°μ‘΄ λ‘œλ΄‡κ³Ό 같은 곡격방식, κ±·κΈ° 방식을 κ°™κ³  μžˆλ‹€λ©΄ 또 μ€‘λ³΅λ˜λŠ” μ½”λ“œκ°€ μŒ“μ΄κ³  μˆ˜μ •μ‹œμ—λ„ OCPλ₯Ό μœ„λ°°ν•˜κ²Œ λ©λ‹ˆλ‹€.

 

정리 

  OCP μœ„λ°°

  μ‹œμŠ€ν…œ ν™•μž₯ μ‹œ μ€‘λ³΅λ˜λŠ” μ½”λ“œ λ°œμƒ 

 

μœ„ 같은 문제점이 λ°œμƒν•˜κΈ° λ•Œλ¬Έμ— 자주 λ°”λ€ŒλŠ” 곡격와 이동 λ©”μ„œλ“œλ₯Ό μΊ‘μŠν™” ν•΄μ£Όμ–΄μ•Ό ν•©λ‹ˆλ‹€. 즉, 자주 λ³€ν™”λ˜λŠ” 것을 μ°Ύκ³  이λ₯Ό 클래슀둜 μΊ‘μŠν™”ν•΄μ•Ό ν•©λ‹ˆλ‹€.

 

  OCP(Open-Closed Principle, 개방 폐쇠 원칙)

: 클래슀 ν™•μž₯μ—λŠ” μ—΄λ €μžˆκ³  λ³€κ²½μ—λŠ” λ‹«ν˜€μžˆμ–΄μ•Όν•œλ‹€. 

 

  μΊ‘μŠν™”(encapsulation)

: κΈ°λŠ₯κ³Ό νŠΉμ„±μ˜ λͺ¨μŒμ„ "클래슀"λΌλŠ” "캑슐"에 λΆ„λ₯˜ν•΄μ„œ λ„£λŠ”κ²ƒ

κ΄€λ ¨ μžˆλŠ” 속성과 κΈ°λŠ₯을 ν•˜λ‚˜λ‘œ λ¬Άκ³  μ ‘κ·Ό μ œμ–΄μžλ₯Ό 톡해 μ™ΈλΆ€λ‘œλΆ€ν„° 직접적인 접근은 μ°¨λ‹¨ν•˜κ³ , 자료λ₯Ό μˆ˜μ • λ˜λŠ” μ‘°μž‘ ν•  수 μžˆλŠ” λ™μž‘μ„ 내뢀에 λ‘λŠ” 방식

 

 

μ΄λ ‡κ²Œ 이동과 곡격기λŠ₯을 μΊ‘μŠν™”ν•˜λŠ” μΈν„°νŽ˜μ΄μŠ€λ₯Ό μƒμ„±ν•˜λ©΄ 각 λ©”μ„œλ“œ λ³„λ‘œ μƒˆλ‘œμš΄ μ „λž΅(곡격 방식, 이동방식)을  자유둭게 μΆ”κ°€, μˆ˜μ •μ΄ κ°€λŠ₯ν•΄μ§‘λ‹ˆλ‹€. 

 

κ°œμ„ λœ 섀계

 

μ΄λŸ¬ν•œ 해결방식을 μ „λž΅ νŒ¨ν„΄μ΄λΌ ν•©λ‹ˆλ‹€.

Strategy Pattern

:  λ§κ·ΈλŒ€λ‘œ μ „λž΅μ„ μ‰½κ²Œ λ°”κΏ€ 수 μžˆλ„λ‘ ν•΄μ£ΌλŠ” λ””μžμΈ νŒ¨ν„΄

:  μ „λž΅ νŒ¨ν„΄μ΄λž€ 같은 κΈ°λŠ₯을 ν•˜λŠ” μ•Œκ³ λ¦¬μ¦˜μ„ μΊ‘μŠν™”ν•˜μ—¬ μ„œλ‘œ κ°„ μƒν˜Έ ꡐ체가 κ°€λŠ₯ν•˜λ„λ‘ ν•˜λŠ” λ””μžμΈ νŒ¨ν„΄

:  μƒˆλ‘œμš΄ μ•Œκ³ λ¦¬μ¦˜μ΄ μΆ”κ°€λ˜μ–΄λ„ 기쑴의 μ½”λ“œλ₯Ό μˆ˜μ •ν•  ν•„μš”κ°€ 없이 μ‰½κ²Œ μΆ”κ°€κ°€ κ°€λŠ₯ν•΄μ§„λ‹€. => OCP 만쑱 

:  ν”„λ‘œκ·Έλž¨μ—μ„œ μ‰½κ²Œ μ „λž΅μ„ λ°”κΏ”μ•Όν•  ν•„μš”κ°€ μžˆλŠ” 경우 많이 λ°œμƒν•  λ•Œ μ‚¬μš©

 

  κ°μ²΄κ°€ ν•  수 μžˆλŠ” ν–‰μœ„λ“€μ„ 각각의 μ „λž΅μœΌλ‘œ λ§Œλ“€μ–΄ 놓고 λ™μ μœΌλ‘œ ν–‰μœ„μ˜ μˆ˜μ •μ΄ ν•„μš”ν•œ 경우 μ „λž΅μ„ λ°”κΎΈλŠ” κ²ƒλ§ŒμœΌλ‘œ ν–‰μœ„μ˜ μˆ˜μ •μ΄ κ°€λŠ₯ν•˜λ„λ‘ λ§Œλ“  νŒ¨ν„΄ 

 

μ „λž΅μ€ λͺ©μ μ„ λ‹¬μ„±ν•˜κΈ° μœ„ν•΄ 일을 μˆ˜ν–‰ν•˜λŠ” 방식, λΉ„μ¦ˆλ‹ˆμŠ€ κ·œμΉ™, 문제λ₯Ό ν•΄κ²°ν•˜λŠ” μ•Œκ³ λ¦¬μ¦˜ 등이 될 수 μžˆλ‹€.

 

 

 

  Strategy:  μΈν„°νŽ˜μ΄μŠ€λ‚˜ μΆ”μƒν΄λž˜μŠ€λ‘œ μ™ΈλΆ€μ—μ„œ λ™μΌν•œ λ°©μ‹μœΌλ‘œ μ•Œκ³ λ¦¬μ¦˜μ„ ν˜ΈμΆœν•˜λŠ” 방법을 λͺ…μ‹œν•œλ‹€.

  ConcreteStrategy1, ConcreteStrategy2, ConcreteStrategy3 : μŠ€νŠΈλž˜ν‹°μ§€ νŒ¨ν„΄μ—μ„œ λͺ…μ‹œν•œ μ•Œκ³ λ¦¬μ¦˜μ„ μ‹€μ œλ‘œ κ΅¬ν˜„ν•œ 클래슀

  Context: μŠ€νŠΈλž˜ν‹°μ§€ νŒ¨ν„΄μ„ μ΄μš©ν•˜λŠ” 역할을 μˆ˜ν–‰, ν•„μš”μ— 따라 λ™μ μœΌλ‘œ ꡬ체적인 μ „λž΅μ„ λ°”κΏ€ 수 μžˆλ„λ‘  setterλ©”μ„œλ“œ 제곡 

 

정인상, 채홍석 JAVA 객체 μ§€ν–₯ λ””μžμΈ νŒ¨ν„΄, ν•œλΉ›λ―Έλ””μ–΄