🌻 JAVA/λ””μžμΈ νŒ¨ν„΄

1. μŠ€νŠΈλž˜ν‹°μ§€(Strategy) νŒ¨ν„΄ - Head First Design Patterns

iseunghan 2020. 4. 4. 11:56
λ°˜μ‘ν˜•

 

* 상속을 잘 ν™œμš©ν•˜λ©΄ μž¬μ‚¬μš© ν• μˆ˜ μžˆμ§€λ§Œ, μ‹€μ œ μ½”λ“œλ₯Ό μ •λΉ„ ν•˜λŠ”λ°λŠ” 별 도움이 λ˜μ§€ μ•ŠλŠ”λ‹€.

 

일단 잘λͺ»λœ 예λ₯Ό λ¨Όμ € 보자.

이런 μ‹μœΌλ‘œ μ½”λ“œλ₯Ό κ΅¬ν˜„ν•˜λ©΄ , λ‚˜μ€‘μ— 행동을 μΆ”κ°€ν•œλ‹€λ˜μ§€, λ‹€λ₯Έ 였리λ₯Ό μΆ”κ°€ ν• λ•Œ λ¬Έμ œκ°€ λ°œμƒν•œλ‹€.

μ½”λ“œλ₯Ό μž¬μ‚¬μš©ν•˜λŠ” μ μ—μ„œλ„ 쒋지 μ•Šκ³ , λ‚˜μ€‘μ— λ‚ μ•„λ‹€λ‹ˆλŠ”, κ½₯κ½₯ κ±°λ¦¬λŠ” 행동을 λ°”κΏ€λ•Œ, λͺ¨λ“  μ½”λ“œλ₯Ό λ‹€ λ°”κΏ”μ•Όν•˜λŠ” 상황을 μ΄ˆλž˜ν•œλ‹€. 

 

 

λ””μžμΈ 원칙 ) μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ—μ„œ λ‹¬λΌμ§€λŠ” 뢀뢄을 μ°Ύμ•„λ‚΄κ³ , 달라지지 μ•ŠλŠ” λΆ€λΆ„μœΌλ‘œλΆ€ν„° λΆ„λ¦¬μ‹œν‚¨λ‹€.

 

 

κ·Έλ ‡λ‹€λ©΄, Duckν΄λž˜μŠ€μ—μ„œλŠ” ?

λ‚˜λŠ” 행동과 κ½₯κ½₯ κ±°λ¦¬λŠ” 행동을 뢄리 μ‹œν‚¨λ‹€.

 

λ””μžμΈ 원칙 ) κ΅¬ν˜„μ΄ μ•„λ‹Œ μΈν„°νŽ˜μ΄μŠ€μ— λ§žμΆ°μ„œ ν”„λ‘œκ·Έλž˜λ° ν•œλ‹€.

 

Catμ—λŠ” "λƒμ˜Ή" , Dogμ—λŠ” "μ›”μ›”"

 


  • μ΄λŸ°μ‹μœΌλ‘œ λ””μžμΈ ν•˜λ©΄ λ‹€λ₯Έ ν˜•μ‹ κ°œμ²΄μ—μ„œλ„ λ‚˜λŠ” 행동과 κ½₯κ½₯ 행동을 μž¬μ‚¬μš© ν• μˆ˜ μžˆλ‹€. (μ½”λ“œμ˜ μž¬μ‚¬μš©)
  • 그리고, 기쑴의 행동 클래슀λ₯Ό μˆ˜μ •ν•˜κ±°λ‚˜ λ‚ μ•„λ‹€λ‹ˆλŠ” 행동을 μ‚¬μš©ν•˜λŠ” Duck 클래슀λ₯Ό μ „ν˜€ κ±΄λ“œλ¦¬μ§€ μ•Šκ³ λ„ μƒˆλ‘œμš΄ 행동을 μΆ”κ°€ ν• μˆ˜ μžˆλ‹€.

*μ—¬κΈ°μ„œ μ€‘μš”ν•œ 점은 quack() , fly() λ₯Ό ν΄λž˜μŠ€μ— μ•Œλ§žκ²Œ μ‹€ν–‰ μ‹œν‚¬μˆ˜ μžˆμ–΄μ•Ό ν•œλ‹€.

 

λ§Œμ•½ RubberDuck(μž₯λ‚œκ° 고무였리) λŠ”? - (λ‚ μˆ˜ μ—†λ‹€, μ‚‘ μ†Œλ¦¬λ₯Ό λ‚Έλ‹€.)

//RubberDuck.java 쀑 μƒμ„±μž λΆ€λΆ„.

public RubberDuck(){
	flyBehavior = new FlyNoWay();
     quackBehavior = new Squeak();
}

이런 μ‹μœΌλ‘œ 각 였리의 νŠΉμ§•μ— 맞게 μƒμ„±μžμ—μ„œ μ΄ˆκΈ°ν™”λ₯Ό μ‹œμΌœμ€˜μ•Όν•œλ‹€.

ν•˜μ§€λ§Œ, 싀행쀑에 λ™μ μœΌλ‘œ 행동을 μ§€μ •ν• μˆ˜λŠ” μ—†λ‹€.

그러렀면 μ–΄λ–»κ²Œ ν•΄μ•Όν•˜λŠ”κ°€??

 

//Duck.java

public void setFlyBehavior( FlyBehavior fb ){
	flyBehavior = fb;
}

public void setQuackBehavior( QuackBehavior qb){
	quackBehavior = qb;
}

싀행쀑에 λ™μ μœΌλ‘œ 행동 μ§€μ •ν•˜κΈ°. setter λ©”μ†Œλ“œ μ‚¬μš©!

μ•„λž˜λŠ” mainλ¬Έμ—μ„œ 행동을 μ§€μ •ν•΄μ£ΌλŠ” μ½”λ“œμ΄λ‹€.

 

// main

Duck rubber = new RubberDuck(); // λͺ»λ‚ μŒ, μ‚‘ μ†Œλ¦¬λ₯Ό 냄

rubber.performFly();
rubber.setFlyBehavior( new RocketPowered() ); // λͺ»λ‚˜λŠ” μ˜€λ¦¬μ—κ²Œ λ‘œμΌ“μ„ λ‹¬μ•„μ£Όμ—ˆλ‹€.
rubber.performFly();

 μΆœλ ₯)  μ €λŠ” λͺ»λ‚ μ•„μš”.

         λ‘œμΌ“ μΆ”μ§„μœΌλ‘œ λ‚ μ•„κ°‘λ‹ˆλ‹€!

 


λ””μžμΈ 원칙 ) μƒμ†λ³΄λ‹€λŠ” ꡬ성을 ν™œμš©ν•œλ‹€.

 

 

μ•„λž˜λŠ” 전체 클래슀 닀이어 κ·Έλž¨μ΄λ‹€. 싀행쀑에 λ™μ μœΌλ‘œ 행동이 λ³€κ²½κ°€λŠ₯ν•˜κ³ , 좔후에 μƒˆλ‘œμš΄ 였리λ₯Ό μΆ”κ°€ν•˜κ±°λ‚˜, 행동을 λ³€κ²½ν• λ•Œ κ°„λ‹¨ν•˜κ²Œ μ½”λ“œ 변경을 톡해 행동을 λ°”κΏ€μˆ˜ μžˆλ‹€.

 

 

 

  μŠ€νŠΈλž˜ν‹°μ§€ νŒ¨ν„΄(Strategy Pattern) μ—μ„œλŠ” μ•Œκ³ λ¦¬μ¦˜κ΅°μ„ μ •μ˜ν•˜κ³  각각을 μΊ‘μŠν™”ν•˜μ—¬ κ΅ν™˜ν•΄μ„œ μ‚¬μš©ν•  수 μžˆλ„λ‘ λ§Œλ“ λ‹€. μŠ€νŠΈλž˜ν‹°μ§€ λ₯Ό 잘 ν™œμš©ν•˜λ©΄ μ•Œκ³ λ¦¬μ¦˜μ„ μ‚¬μš©ν•˜λŠ” ν΄λΌμ΄μ–ΈνŠΈμ™€λŠ” λ…λ¦½μ μœΌλ‘œ μ•Œκ³ λ¦¬μ¦˜μ„ λ³€κ²½ν•  수 μžˆλ‹€.

 

λ°˜μ‘ν˜•