Skip to content

Latest commit

Β 

History

History
43 lines (27 loc) Β· 1.94 KB

State_Pattern.md

File metadata and controls

43 lines (27 loc) Β· 1.94 KB

State Pattern

State Pattern (μƒνƒœ νŒ¨ν„΄)

μ–΄λ–€ 객체가 μƒνƒœ 정보λ₯Ό κ°–κ³ , μƒνƒœμ— 따라 λ‹€λ₯Έ λ™μž‘μ„ μˆ˜ν–‰ν•œλ‹€κ³  ν•˜μž. κ·Έλ ‡λ‹€λ©΄ 객체 λ‚΄μ—μ„œ 이λ₯Ό μ²˜λ¦¬ν•˜κΈ° μœ„ν•΄μ„œλŠ” μ•„λž˜μ™€ 같이 μ½”λ“œλ₯Ό κ΅¬ν˜„ν•  수 μžˆλ‹€.

예) TCP Connection State에 λ”°λ₯Έ λΆ„κΈ°

class TCPConnection {

	private String state;

	public void transmit() {
		if (state.equals("CLOSED") { ... }
		else if (state.equals("ESTABLISHED") { ... }
		else if (state.equals("LISTEN") { ... }
	}

}

κ·ΈλŸ¬λ‚˜ μ΄λŸ¬ν•œ μ½”λ“œλŠ” μ§€μ €λΆ„ν•˜κ³ , μƒˆλ‘œμš΄ μƒνƒœκ°€ 좔가될 λ•Œλ§ˆλ‹€ μˆ˜μ •λ˜μ–΄μ•Ό ν•œλ‹€λŠ” μ μ—μ„œ 쒋지 μ•Šμ€ κ΅¬ν˜„μ΄λΌκ³  ν•  수 μžˆλ‹€. μ΄λŸ¬ν•œ λΆ„κΈ°λ₯Ό ν•΄κ²°ν•˜κΈ° μœ„ν•΄ μ‚¬μš©ν•˜λŠ” νŒ¨ν„΄μ΄ μƒνƒœ νŒ¨ν„΄μ΄λ‹€.

μƒνƒœ νŒ¨ν„΄μ€ 각 μƒνƒœλ₯Ό 데이터(field)κ°€ μ•„λ‹Œ μƒνƒœ 클래슀둜 λ‚˜νƒ€λ‚Έλ‹€. 이듀이 μƒνƒœ μΈν„°νŽ˜μ΄μŠ€λ₯Ό κ΅¬ν˜„ν•˜λ„λ‘ ν•˜μ—¬ 기쑴의 λΆ„κΈ°λ¬Έμ—μ„œ μƒνƒœ μΈν„°νŽ˜μ΄μŠ€ μžλ£Œν˜•μ˜ κ°μ²΄λ‘œλΆ€ν„° λ©”μ†Œλ“œλ₯Ό ν˜ΈμΆœν•  수 μžˆλ„λ‘ κ΅¬ν˜„ν•œλ‹€.

μœ„μ˜ TCP Connection 예제의 경우 μƒνƒœ νŒ¨ν„΄μ„ μ μš©ν•˜λ©΄ μ•„λž˜μ™€ 같이 섀계할 수 μžˆλ‹€.

TCP-State

ꡬ성 μš”μ†Œ

State-Pattern

  • Context - ν˜„μž¬ μƒνƒœλ₯Ό λ‚˜νƒ€λ‚΄λŠ” μƒνƒœ 객체의 referenceλ₯Ό κ°€μ§€λŠ” 객체
  • State - Context 객체의 μƒνƒœμ— 따라 μ„œλ‘œ λ‹€λ₯Έ ν–‰μœ„λ₯Ό ν•˜λŠ” ν•¨μˆ˜λ“€μ˜ μΈν„°νŽ˜μ΄μŠ€λ₯Ό μ •μ˜
  • ConcreteState - State 객체λ₯Ό κ΅¬ν˜„ν•˜λ©°, Context의 μƒνƒœμ— 따라 μˆ˜ν–‰λ˜λŠ” ν–‰μœ„λ“€μ„ κ΅¬ν˜„

νŠΉμ§•

  • μƒνƒœλ₯Ό λ³€κ²½ν•  수 μžˆλŠ” κΆŒν•œ(changeState)은 μƒνƒœ 정보λ₯Ό κ°–λŠ” 객체와 μƒνƒœ 객체 κ·Έ 자체 뿐이닀.
  • μƒνƒœ νŒ¨ν„΄μ„ μ΄μš©ν•˜λ©΄ μ–΄λ–€ μƒνƒœ 객체의 λ©”μ†Œλ“œκ°€ ν˜ΈμΆœλ μ§€κ°€ λŸ°νƒ€μž„μ— 결정될 수 μžˆλ‹€λŠ” μž₯점이 μžˆλ‹€.
  • 각 μƒνƒœ κ°μ²΄λŠ” ν•˜λ‚˜μ”©λ§Œ μ‘΄μž¬ν•΄λ„ 되기 λ•Œλ¬Έμ— 싱글톀 νŒ¨ν„΄μ„ ν™œμš©ν•  수 μžˆλ‹€.