🌷Dev

[Java] μ „λž΅ νŒ¨ν„΄(Strategy Pattern)을 μ μš©ν•˜μ—¬ OCP, SRPλ₯Ό λ”°λ₯Έ 섀계

alreadykite 2023. 12. 5. 16:40
곡유 νŽ˜μ΄μ§€ 리뉴얼 ν”„λ‘œμ νŠΈμ—μ„œ 곡유 νŽ˜μ΄μ§€ 내에 μ—¬λŸ¬ 블둝듀이 있고 각 블둝듀은 λ“œλž˜κ·Έμ•€λ“œλ‘­ κ°€λŠ₯ 유무둜 λΆ„λ₯˜λœλ‹€.

 

 

 

μˆ˜μ • μ „ μ½”λ“œ


객체λ₯Ό λ™μ μœΌλ‘œ κ΄€λ¦¬ν•˜κΈ° μœ„ν•΄ μ²˜μŒμ—λŠ” switch case 문으둜 κ°œλ°œν•˜μ˜€λ‹€. μ—¬κΈ°μ„œ blockType이 μΆ”κ°€/μ‚­μ œλ  경우 Serice 클래슀의 μ½”λ“œκ°€ λ³€κ²½λ˜μ–΄μ•Ό ν•˜κΈ° λ•Œλ¬Έμ— OCP에 μœ„λ°°λ˜λŠ” μœ μ§€λ³΄μˆ˜μ„±μ΄ μ’‹μ§€ μ•Šμ€ μ½”λ“œμ΄λ‹€. λ˜ν•œ μ‹€ν–‰ 쀑 blockType의 ꡐ체가 λΉˆλ²ˆν•˜κ²Œ λ°œμƒν•˜μ—¬ μ „λž΅ νŒ¨ν„΄μ„ μ΄μš©ν•΄ μ½”λ“œλ₯Ό κ°œμ„ ν•˜κΈ°λ‘œ ν–ˆλ‹€.

 

πŸ”½ μ „λž΅ νŒ¨ν„΄μ„ μ„ νƒν•œ 이유

 

[Java] μ „λž΅ νŒ¨ν„΄ vs ν…œν”Œλ¦Ώ λ©”μ„œλ“œ νŒ¨ν„΄ vs μƒνƒœ νŒ¨ν„΄

ν”„λ‘œμ νŠΈμ—μ„œ λŸ°νƒ€μž„ μ‹œ 객체λ₯Ό λ™μ μœΌλ‘œ κ΄€λ¦¬ν•˜κ³ , OCPλ₯Ό λ§Œμ‘±ν•˜λŠ” μ½”λ“œλ‘œ κ°œμ„ ν•˜κΈ° μœ„ν•΄ λ””μžμΈ νŒ¨ν„΄μ„ κ³ λ €ν•œ 과정을 κΈ°λ‘ν•˜μ˜€λ‹€. 1. μ „λž΅ νŒ¨ν„΄ vs ν…œν”Œλ¦Ώ λ©”μ„œλ“œ νŒ¨ν„΄ ν…œν”Œλ¦Ώ λ©”μ„œλ“œ νŒ¨ν„΄μ€

miyeonlee.tistory.com

 

 

 

 

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


μ‹€ν–‰(λŸ°νƒ€μž„) 쀑에 μ•Œκ³ λ¦¬μ¦˜ μ „λž΅μ„ μ„ νƒν•˜μ—¬ 객체 λ™μž‘μ„ λ™μ μœΌλ‘œ λ°”λ€Œλ„λ‘ ν•  수 μžˆλŠ” ν–‰μœ„ λ””μžμΈ νŒ¨ν„΄μ΄λ‹€.

μ—¬κΈ°μ„œ μ „λž΅μ΄λž€, μΌμ’…μ˜ μ•Œκ³ λ¦¬μ¦˜μ΄ 될 수 도 있고 κΈ°λŠ₯μ΄λ‚˜ λ™μž‘μ΄ 될 수 도 μžˆλŠ”, νŠΉμ •ν•œ λͺ©ν‘œλ₯Ό μˆ˜ν–‰ν•˜κΈ° μœ„ν•œ 행동 κ³„νšμ„ λ§ν•œλ‹€.

즉, μ–΄λ–€ 일을 μˆ˜ν–‰ν•˜λŠ” μ•Œκ³ λ¦¬μ¦˜μ΄ μ—¬λŸ¬ 가지일 λ•Œ λ™μž‘λ“€μ„ 미리 μ „λž΅μœΌλ‘œ μ •μ˜ν•¨μœΌλ‘œμ¨ μ†μ‰½κ²Œ μ „λž΅μ„ ꡐ체할 수 있고 μ•Œκ³ λ¦¬μ¦˜ λ³€ν˜•μ΄ λΉˆλ²ˆν•˜κ²Œ ν•„μš”ν•œ κ²½μš°μ— μ ν•©ν•œ νŒ¨ν„΄μ΄λ‹€. 

λ””μžμΈ νŒ¨ν„΄μ΄λž€
반볡적으둜 λ‚˜νƒ€λ‚œ λ¬Έμ œμ— λŒ€ν•΄ 그것을 ν•΄κ²°ν•œ κ²½ν—˜ 및 λ…Έν•˜λ£¨λ₯Ό μΆ•μ ν•˜μ—¬ μž¬μ΄μš©ν•˜κΈ° 쒋은 ν˜•νƒœλ‘œ 이름을 λΆ™μ—¬ 해법을 μ œμ‹œν•˜λŠ” νŒ¨ν„΄ 양식

 

μ „λž΅ νŒ¨ν„΄μ„ μ μš©ν•˜κΈ° μœ„ν•΄μ„œλŠ” μ•„λž˜μ™€ 같은 단계λ₯Ό λ”°λ₯Έλ‹€.

β‘  λ³€κ²½λ˜λŠ” 것과 λ³€κ²½λ˜μ§€ μ•ŠλŠ” 것을 μ—„κ²©ν•˜κΈ° κ΅¬λΆ„ν•œλ‹€.

β‘‘ 두 λͺ¨λ“ˆμ΄ λ§Œλ‚˜λŠ” 지점에 μΈν„°νŽ˜μ΄μŠ€λ₯Ό μ •μ˜ν•œλ‹€. (λ³€ν•˜λŠ” 것에 λŒ€ν•œ 좔상화, μΊ‘μŠν™”)

β‘’ κ΅¬ν˜„μ— μ˜μ‘΄ν•˜κΈ° 보닀 μ •μ˜ν•œ μΈν„°νŽ˜μ΄μŠ€μ— μ˜μ‘΄ν•˜λ„λ‘ μ„€κ³„ν•œλ‹€.

Context : λ³€κ²½λ˜μ§€ μ•ŠλŠ” 것, μ „λž΅ νŒ¨ν„΄μ„ μ΄μš©ν•˜λŠ” 역할을 ν•˜κ³  DIλ₯Ό 톡해 λ™μ μœΌλ‘œ μ „λž΅μ„ λ³€κ²½ν•œλ‹€.

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

ConcreateStrategy : λ³€κ²½λ˜λŠ” 것, Strategyμ—μ„œ λͺ…μ‹œν•œ μ•Œκ³ λ¦¬μ¦˜μ„ κ΅¬ν˜„ν•œ 클래슀

 

 

 

 

μ „λž΅ νŒ¨ν„΄ 적용


1) 동일 κ³„μ—΄μ˜ μ•Œκ³ λ¦¬μ¦˜ ꡰ을 μ •μ˜ν•˜κ³ , 각 μ•Œκ³ λ¦¬μ¦˜μ„ μΊ‘μŠν™” 

  • μœ„μ™€ 같이 ν–‰μœ„μ— λŒ€ν•œ μ „λž΅ 클래슀(ListBlockStrategy, WallInfoBlockStrategy λ“±)λ₯Ό μƒμ„±ν•˜κ³ 
  • μœ μ‚¬ν•œ ν–‰μœ„λ“€μ„ μΊ‘μŠν™”ν•˜λŠ” μΈν„°νŽ˜μ΄μŠ€(FixBlockStrategy, MoveBlockStrategy)λ₯Ό μ •μ˜ν•˜μ˜€λ‹€. 

 

 

2) μ „λž΅ ν΄λž˜μŠ€λ“€μ„ μƒμ„±ν•˜κ³  κ΄€λ¦¬ν•˜λŠ” 클래슀 생성

  • μ „λž΅μ— λŒ€ν•œ νŒ©ν† λ¦¬ 클래슀(BlockStrategyFactory)λ₯Ό μ •μ˜ν•˜κ³ , 이 ν΄λž˜μŠ€μ— μ „λž΅μ„ μ„€μ •ν•˜λŠ” λ©”μ„œλ“œ(findMoveBlockStrategy, findFIxBlockStrategy)λ₯Ό μ •μ˜ν•˜μ˜€λ‹€.
  • μΊ‘μŠν™”ν•œ μΈν„°νŽ˜μ΄μŠ€(FixBlockStrategy, MoveBlockStrategy)λ₯Ό μƒμ†ν•œ μ „λž΅ 객체λ₯Ό νŒ©ν† λ¦¬ ν΄λž˜μŠ€μ— μ£Όμž…λ°›μ•„μ„œ μ „λž΅λ“€μ„ λ‹΄λŠ” λ³€μˆ˜(moveBlockStrategies, fixBlockStrategies)κ°€ μ΄ˆκΈ°ν™”λœλ‹€.
  • μ „λž΅μ„ μ„€μ •ν•˜λŠ” λ©”μ„œλ“œλ“€(findMoveBlockStrategy())은 BlockStrategyName(enum)을 인자둜 λ°›μ•„μ„œ Mapνƒ€μž…μ˜ moveBlockStrategies λ³€μˆ˜μ—μ„œ λ§€ν•‘λ˜λŠ” 객체λ₯Ό λ¦¬ν„΄ν•œλ‹€. 

μ΄λ ‡κ²Œ μ „λž΅λ§Œ λ°”κΏ”μ€ŒμœΌλ‘œμ¨ 객체λ₯Ό λ™μ μœΌλ‘œ λ°”κΏ€ 수 μžˆλ‹€.  

 

 

3) μ „λž΅λ“€μ„ μƒν˜Έ κ΅ν™˜μ΄ κ°€λŠ₯ν•˜λ„λ‘ 섀계

μœ„μ™€ 같이 Service ν΄λž˜μŠ€μ—μ„œ BlockStrategyFactory 객체λ₯Ό μ˜μ‘΄μ„± μ£Όμž…λ°›λŠ”λ‹€. 

 

findFixBlockStrategy()λ©”μ†Œλ“œλ₯Ό 톡해 μ „λž΅ 객체λ₯Ό μ°Ύκ³ , ν•΄λ‹Ή 객체(MoveBloackStrategyλ₯Ό κ΅¬ν˜„ν•œ μ „λž΅ ν΄λž˜μŠ€λ“€ 쀑)의 createFixBlockDTO()κ°€ ν˜ΈμΆœλœλ‹€.

 

 

정리


μ „λž΅νŒ¨ν„΄μ„ μ μš©ν•˜λ©΄ OCP(개방 폐쇄 원칙)을 μ§€μΌœμ„œ 섀계할 수 μžˆλ‹€.

μ „λž΅μ΄ μΆ”κ°€λ˜λ”λΌλ„ Service 클래슀의 μ½”λ“œλŠ” μˆ˜μ •λ˜μ§€ μ•Šκ³  ν•΄λ‹Ή λΈ”λ‘μ˜ μ „λž΅ 클래슀만 μƒμ„±ν•˜λ©΄ 되기 λ•Œλ¬Έμ— OCP원칙을 λ”°λ₯΄κ³ ,

λ˜ν•œ μ˜ˆμ‹œ μ½”λ“œμ—μ„œλŠ” BlockStrategyFactoryλŠ” λ‹€μ–‘ν•œ μ „λž΅ ν΄λž˜μŠ€λ“€μ„ 생성 및 κ΄€λ¦¬ν•˜λŠ” μ±…μž„μ„ μ§€κ³  Service ν΄λž˜μŠ€λŠ” λΉ„μ¦ˆλ‹ˆμŠ€ λ‘œμ§μ„ μ²˜λ¦¬ν•˜λŠ” μ±…μž„λ§Œμ„ κ°–κ²Œ λ˜λ©΄μ„œ 각 ν΄λž˜μŠ€λŠ” ν•˜λ‚˜μ˜ μ±…μž„λ§Œ κ°€μ§„λ‹€λŠ” 단일 μ±…μž„ 원칙을 λ”°λ₯΄κ²Œ λœλ‹€.

 

 

 

 

 

 


πŸ™ μ°Έκ³  링크 

 

πŸ’  μ „λž΅(Strategy) νŒ¨ν„΄ - μ™„λ²½ λ§ˆμŠ€ν„°ν•˜κΈ°

Strategy Pattern μ „λž΅ νŒ¨ν„΄μ€ μ‹€ν–‰(λŸ°νƒ€μž„) 쀑에 μ•Œκ³ λ¦¬μ¦˜ μ „λž΅μ„ μ„ νƒν•˜μ—¬ 객체 λ™μž‘μ„ μ‹€μ‹œκ°„μœΌλ‘œ λ°”λ€Œλ„λ‘ ν•  수 있게 ν•˜λŠ” ν–‰μœ„ λ””μžμΈ νŒ¨ν„΄ 이닀. μ—¬κΈ°μ„œ 'μ „λž΅'μ΄λž€ μΌμ’…μ˜ μ•Œκ³ λ¦¬μ¦˜μ΄ 될 수

inpa.tistory.com

 

[λ””μžμΈνŒ¨ν„΄] μ „λž΅ νŒ¨ν„΄ ( Strategy Pattern )

μ „λž΅ νŒ¨ν„΄ ( Strategy Pattern )객체듀이 ν•  수 μžˆλŠ” ν–‰μœ„ 각각에 λŒ€ν•΄ μ „λž΅ 클래슀λ₯Ό μƒμ„±ν•˜κ³ , μœ μ‚¬ν•œ ν–‰μœ„λ“€μ„ μΊ‘μŠν™” ν•˜λŠ” μΈν„°νŽ˜μ΄μŠ€λ₯Ό μ •μ˜ν•˜μ—¬,객체의 ν–‰μœ„λ₯Ό λ™μ μœΌλ‘œ λ°”κΎΈκ³  싢은 경우 직접

victorydntmd.tistory.com