λ°μν
State Pattern
μν ν¨ν΄(State Pattern)μ κ°μ²΄κ° λ΄λΆ μνμ λ°λΌ νλμ λ€λ₯΄κ² ν μ μκ² ν΄μ£Όλ λμμΈ ν¨ν΄μ λλ€.
- κ°μ²΄λ μνλ₯Ό λ³κ²½ν¨μΌλ‘μ¨ νλμ΄ λ°λλλ€.
- μν ν¨ν΄μ μ¬μ©νλ©΄ 쑰건문μ λ§μ΄ μ¬μ©νλ μ½λλ₯Ό κ°κ²°νκ³ νμ₯ κ°λ₯νκ² λ§λ€ μ μμ΅λλ€.
- Stateλ μν = μ¬λ¬Όμ λͺ¨μμ΄λ ννΈμ μλ―Έν©λλ€.
- λν μνλ₯Ό ν΄λμ€λ‘ νννλ©΄ ν΄λμ€λ₯Ό κ΅μ²΄ν΄μ 'μνμ λ³ν'λ₯Ό ννν μ μμ΅λλ€.
- Strategy Patternκ³Ό μ‘°κΈ μ μ¬ν©λλ€.
μ°λ¦¬κ° λ§λ€κ³ μ νλ Objectμ μνκ° μλ€λ©΄ μ¬μ©ν μ μλ Pattern μ λλ€.
- μνλ₯Ό κ°μ§λ κ°μ₯ λνμ μΈ μκ° μ νΈλ± μ λλ€.
- λ Ήμ, λΉ¨κ°μ μ€ νλμ μνλ§ κ°μ§λ κΈ°κ³μ΄λ©°, κ³μν΄μ μνκ° λ³νλ©λλ€.
State Patternμ μ¬μ©νμ§ μμ μ½λ
class TrafficLight:
def __init__(self):
self.state = 'green'
def setState(self, state: str):
self.state = state
def speak(self):
if self.state == 'green':
print('green light')
elif self.state == 'red':
print('red light')
def wait(self):
print('wait.. the light changed')
if self.state == 'green':
self.state = 'red'
elif self.state == 'red':
self.state = 'green'
- __init__
- κΈ°λ³Έ stateλ 'green'μΌλ‘ μ€μ ν©λλ€.
- setState
- νμ¬ stateλ₯Ό μ€μ ν μ μλ ν¨μμ λλ€.
- speak
- νμ¬ stateμ λ°λΌ 'green light' λλ 'red light'λ₯Ό μΆλ ₯ν©λλ€.
- wait
- νΈμΆ μ stateκ° λ³κ²½λλ©°, 'wait.. the light changed'λ₯Ό μΆλ ₯ν©λλ€.
# μμ μ¬μ©
t_light = TrafficLight()
t_light.speak() # μΆλ ₯: green light
t_light.wait() # μΆλ ₯: wait.. the light changed
t_light.speak() # μΆλ ₯: red light
- TrafficLight κ°μ²΄μΈ t_light μ μμ±ν©λλ€.
- speak() νΈμΆ μ νμ¬ stateλ greenμ΄λ―λ‘ 'green light' κ° μΆλ ₯λ©λλ€.
- wait() νΈμΆ μ stateκ° redλ‘ λ³κ²½λλ©° 'wait.. the light changed' κ° μΆλ ₯λ©λλ€.
- speak() νΈμΆ μ stateλ redμ΄λ―λ‘ 'red light' κ° μΆλ ₯λ©λλ€.
νμ§λ§, Stateκ° λ§μμ§λ€λ©΄ νμ¬ μ½λ ꡬ쑰λ‘λ 볡μ‘μ±μ λμνκΈ°κ° μ΄λ ΅μ΅λλ€.
μ΄λ State Patternμ μ΄μ©ν μ μμ΅λλ€.
TrafficLight Class
class TrafficLight:
def __init__(self):
self.state = GreenLight()
def setState(self, state):
self.state = state
def speak(self):
self.state.status()
def wait(self):
self.state.changeLight(self)
TrafficLight ν΄λμ€
- κΈ°λ³Έ μνλ‘ GreenLight κ°μ²΄λ₯Ό κ°μ§λλ€.
- setState λ©μλλ₯Ό ν΅ν΄ μνλ₯Ό λ³κ²½ν μ μμ΅λλ€.
- speak λ©μλλ₯Ό νΈμΆνλ©΄ νμ¬ μν κ°μ²΄μ status λ©μλλ₯Ό νΈμΆνμ¬ μνλ₯Ό μΆλ ₯ν©λλ€.
- wait λ©μλλ₯Ό νΈμΆνλ©΄ νμ¬ μν κ°μ²΄μ changeLight λ©μλλ₯Ό νΈμΆνμ¬ μνλ₯Ό λ³κ²½ν©λλ€.
State ν΄λμ€ λ° κ΅¬μ²΄μ μΈ μν ν΄λμ€
class State:
def status(self):
pass
def changeLight(self, traffic_light: TrafficLight):
pass
class GreenLight(State):
def status(self):
print('green light')
def changeLight(self, traffic_light: TrafficLight):
print('wait.. the light changed')
traffic_light.setState(RedLight())
class RedLight(State):
def status(self):
print('red light')
def changeLight(self, traffic_light: TrafficLight):
print('wait.. the light changed')
traffic_light.setState(GreenLight())
- State ν΄λμ€
- μν κ°μ²΄λ€μ΄ μμλ°λ μΆμ ν΄λμ€μ λλ€.
- status λ©μλλ νμ¬ μνλ₯Ό μΆλ ₯ν©λλ€.
- changeLight λ©μλλ μνλ₯Ό λ³κ²½ν©λλ€.
- GreenLight ν΄λμ€
- State ν΄λμ€λ₯Ό μμλ°μ ꡬνλ ν΄λμ€μ λλ€.
- status λ©μλλ "green light"λ₯Ό μΆλ ₯ν©λλ€.
- changeLight λ©μλλ TrafficLight κ°μ²΄μ μνλ₯Ό RedLightλ‘ λ³κ²½ν©λλ€.
- RedLight ν΄λμ€
- State ν΄λμ€λ₯Ό μμλ°μ ꡬνλ ν΄λμ€μ λλ€.
- status λ©μλλ "red light"λ₯Ό μΆλ ₯ν©λλ€.
- changeLight λ©μλλ TrafficLight κ°μ²΄μ μνλ₯Ό GreenLightλ‘ λ³κ²½ν©λλ€.
t_light = TrafficLight()
t_light.speak() # μΆλ ₯: green light
t_light.wait() # μΆλ ₯: wait.. the light changed
t_light.speak() # μΆλ ₯: red light
- λμ μμ
- t_light κ°μ²΄λ₯Ό μμ±νκ³ speak λ©μλλ₯Ό νΈμΆνλ©΄ νμ¬ μνμΈ "green light"κ° μΆλ ₯λ©λλ€.
- wait λ©μλλ₯Ό νΈμΆνλ©΄ μνκ° RedLightλ‘ λ³κ²½λκ³ "wait.. the light changed"κ° μΆλ ₯λ©λλ€.
- λ€μ speak λ©μλλ₯Ό νΈμΆνλ©΄ νμ¬ μνμΈ "red light"κ° μΆλ ₯λ©λλ€.
κ°λ νμ₯
Divide and Conquer
- μ£Όμ΄μ§ λ¬Έμ λ₯Ό μμ λ¬Έμ λ€λ‘ λλμ΄μΌ ν©λλ€.
- κ°κ°μ ꡬ체μ μΈ μνλ₯Ό κ°κ°μ ν΄λμ€λ‘ ννν΄μ λ¬Έμ λ₯Ό λΆν ν κ²μ λλ€.
- State ν¨ν΄μ μ¬μ©νμ§ μμΌλ©΄ μνκ° λ§μΌλ©΄ λ§μμλ‘ μ‘°κ±΄ λΆκΈ°λ μ¦κ°ν©λλ€.
- λΉμ·ν 쑰건λΆκΈ°λ₯Ό μ¬κ±΄μ΄ λ°μν λλ§λ€ νΈμΆλλ λ©μλμ μ λΆ κΈ°μ ν΄ μ£Όμ΄μΌ ν©λλ€.
- State ν¨ν΄μ μμ€ν μ μνλ₯Ό ν΄λμ€λ‘ ννν΄μ 볡μ‘ν νλ‘κ·Έλ¨μ λΆν νκ³ μμ΅λλ€.
Stateμ μ νμ λκ° κ΄λ¦¬ν΄μΌ νλκ°?
- μνλ₯Ό ν΄λμ€λ‘ ννν΄μ ConcreteState μν μ λΆλ΄νλ κ²μ μ’μ λ°©λ²μ λλ€.
- κ·Έλ¬λ State ν¨ν΄μ μ¬μ©ν κ²½μ° μν μ νμ λκ° κ΄λ¦¬ν΄μΌ νλμ§ μκ°ν΄ λ΄μΌ ν©λλ€.
- Context μν μ Traffic Lightκ° μν μ νμ μ€μ λ‘ μννλλ‘ setStateλ₯Ό ꡬννμμ΅λλ€.
- κ·Έλ¬λ setStateλ₯Ό μ€μ λ‘ νΈμΆνλ κ²μ ConcreteState μν μ GreenLight λλ RedLight ν΄λμ€μ λλ€.
- μ¦, μν μ νμ μνμ μμ‘΄ν λμμΌλ‘ κ°μ£Όλκ³ μλλ°, μ΄κ²μ μ₯λ¨μ μ΄ μμ΅λλ€.
- μ₯μ : λ€λ₯Έ μνλ‘ μ ννλ κ²μ λν μ λ³΄κ° νλμ ν΄λμ€ λ΄μ μ 리λμ΄ μκ³ , κ°λ Ή GreenLight ν΄λμ€κ° μ΄λ€ μνλ‘ μ ννλμ§λ GreenLight ν΄λμ€ μ½λλ§ μ½μΌλ©΄ λ©λλ€.
- λ¨μ : νλμ ConcreteState μν μ΄ λ€λ₯Έ ConcreteState μν μ μλ‘ μμμΌ νλ€λ κ²μ λλ€. μ΄κ²μ λ§μ½ νλλ₯Ό μμ νκ³ μΆμΌλ©΄ μμ‘΄λ λ λ€λ₯Έ κ²λ μμ ν΄μΌ νλ€λ κ²μ μλ―Έν©λλ€.
- μν μ νμ ConcreteStateμκ² λ§‘κΈ°λ©΄ ν΄λμ€ μ¬μ΄μ μμ‘΄κ΄κ³κ° κΉμ΄μ§λλ€.
Context μν μκ² μν μ νμ μ 무λ₯Ό 맑기면 λμ§ μλκ°?
- κ·Έλ κ² λλ©΄ κ°κ°μ ConcreteState μν μ λ 립μ±μ΄ λμμ§λ κ²μ μ’μ΅λλ€.
- κ·Έλ¬λ μ΄λ²μλ Context μν μ΄ λͺ¨λ ConcreteState μν μ μμμΌ νλ λ¬Έμ κ° λ°μν©λλ€.
λ°μν
'πΊοΈ Design Pattern' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
[Design Pattern] Template Method Pattern - ν νλ¦Ώ λ©μλ ν¨ν΄ (0) | 2024.07.10 |
---|---|
[Design Pattern] Mediator Pattern - 맀λμμ΄ν° ν¨ν΄ (0) | 2024.06.10 |
[Design Pattern] Visitor Pattern - λ°©λ¬Έμ ν¨ν΄ (0) | 2024.06.10 |
[Design Pattern] Observer Pattern - μ΅μ λ² ν¨ν΄ (0) | 2024.06.09 |
[Design Pattern] Memento Pattern - λ©λ©ν ν¨ν΄ (0) | 2024.06.09 |