U E D R , A S I H C RSS

Gof/State

1. State

1.1. Intent

객체의 λ‚΄λΆ€ μƒνƒœκ°€ λ°”λ€Œμ—ˆμ„ λ•Œ 객체의 행동을 λ°”κΏ€ κ°μ²΄λΌ ν—ˆμš©ν•œλ‹€. κ°μ²΄λŠ” 마치 객체의 ν΄λž˜μŠ€κ°€ λ³€κ²½λœ κ²ƒμ²˜λŸΌ 보일 것이닀.

1.2. Also Known As

Objects for States

1.3. Motivation

λ„€νŠΈμ›Œν¬ 컀λ„μ…˜μ„ λ‚˜νƒ€λ‚΄λŠ” TCPConnection λΌλŠ” ν΄λž˜μŠ€λΌ μƒκ°ν•΄λ³΄μž. TCPConnection κ°μ²΄λŠ” μ—¬λŸ¬κ°€μ§€μ˜ μƒνƒœμ€‘ ν•˜λ‚˜ 일 수 μžˆλ‹€. (Established, Listening, Closed). TCPConnection 객체가 λ‹€λ₯Έ κ°μ²΄λ‘œλΆ€ν„° requestλΌ λ°›μ•˜μ„ λ•Œ, TCPConnection 은 ν˜„μž¬μ˜ μƒνƒœμ— 따라 λ‹€λ₯΄κ²Œ 응닡을 ν•˜κ²Œ λœλ‹€. μ˜ˆλΌ λ“€μ–΄ 'Open' μ΄λΌλŠ” request의 νš¨κ³ΌλŠ” ν˜„μž¬μ˜ μƒνƒœκ°€ Closed 이냐 Established 이냐에 따라 λ‹€λ₯΄λ‹€. StatePattern은 TCPConnection 이 각 μƒνƒœμ— λ”°λ₯Έ λ‹€λ₯Έ ν–‰μœ„λ“€μ„ ν‘œν˜„ν•  수 μžˆλŠ” 방법에 λŒ€ν•΄ μ„λͺ…ν•œλ‹€.

StatePattern 의 주된 μ•„μ΄λ””μ–΄λŠ” λ„€νŠΈμ›Œν¬ 컀λ„μ…˜μ˜ μƒνƒœλΌ λ‚˜νƒ€λ‚΄λŠ” TCPState μΆ”μƒν΄λž˜μŠ€λΌ λ„μž…ν•˜λŠ”λ°μ— μžˆλ‹€. TCPState ν΄λž˜μŠ€λŠ” 각각 λ‹€λ₯Έ μƒνƒœλ“€μ„ ν‘œν˜„ν•˜λŠ” λͺ¨λ“  ν΄λž˜μŠ€λ“€μ— λŒ€ν•œ 일반적인 μΈν„°νŽ˜μ΄μŠ€λΌ μ •μ˜ν•œλ‹€. TCPState의 μ„œλΈŒν΄λž˜μŠ€λŠ” μƒνƒœ-ꡬ체적 ν–‰μœ„λ“€μ„ κ΅¬ν˜„ν•œλ‹€. μ˜ˆλΌ λ“€μ–΄ TCPEstablished λŠ” TCPConnection 의 Established μƒνƒœλΌ, TCPClosed λŠ” TCPConnection 의 Closed μƒνƒœλΌ κ΅¬ν˜„ν•œλ‹€.


TCPConnection ν΄λž˜μŠ€λŠ” TCP 컀λ„μ…˜μ˜ ν˜„μž¬ μƒνƒœλΌ λ‚˜νƒ€λ‚΄λŠ” state κ°μ²΄λΌ κ°€μ§€κ³  μžˆλ‹€. (TCPState μ„œλΈŒν΄λž˜μŠ€μ˜ μΈμŠ€ν„΄μŠ€) TCPConnection 은 이 state κ°μ²΄μ—κ²Œ λͺ¨λ“  μƒνƒœ-ꡬ체적 request듀을 μœ„μž„ (delegate) ν•œλ‹€. TCPConnection 은 컀λ„μ…˜μ˜ νŠΉμ • μƒνƒœμ— λŒ€ν•œ λͺ…령듀을 μˆ˜ν–‰ν•˜κΈ° μœ„ν•΄ TCPState μ„œλΈŒν΄λž˜μŠ€ μΈμŠ€ν„΄μŠ€λΌ μ΄μš©ν•œλ‹€.

컀λ„μ…˜μ΄ μƒνƒœλΌ μ „ν™˜ν•  경우, TCPConnection κ°μ²΄λŠ” μ‚¬μš©ν•˜κ³  μžˆλŠ” state κ°μ²΄λΌ λ°”κΎΌλ‹€. μ˜ˆλΌ λ“€μ–΄ 컀λ„μ…˜μ΄ established μ—μ„œ closed 둜 λ°”λ€ŒλŠ” 경우 TCPConnection 은 ν˜„μž¬μ˜ TCPEstablished μΈμŠ€ν„΄μŠ€λΌ TCPClosed μΈμŠ€ν„΄μŠ€λ‘œ state κ°μ²΄λΌ κ΅μ²΄ν•œλ‹€.

1.4. Applicability

λ‹€μŒκ³Ό 같은 κ²½μš°μ— StatePattern 을 μ΄μš©ν•œλ‹€.
  • 객체의 ν–‰μœ„κ°€ 객체의 μƒνƒœμ— μ˜μ‘΄μ μΌλ•Œ. 그리고 객체가 run-time μ‹œμ— μƒνƒœμ— 따라 ν–‰μœ„λΌ λ°”κΎΈμ–΄μ•Ό ν•  경우.
  • 객체의 μƒνƒœμ— λŒ€ν•œ μ²˜λ¦¬λΌ μœ„ν•΄ κ΅¬ν˜„ν•˜λŠ” 닀쀑 쑰건 μ œμ–΄λ¬Έμ΄ κ±°λŒ€ν•΄μ§ˆ 경우. 이 μƒνƒœλ“€μ„ 일반적으둜 ν•˜λ‚˜λ‚˜ κ·Έ μ΄μƒμ˜ μ—΄κ±°ν˜• μƒμˆ˜λ“€λ‘œ ν‘œν˜„λœλ‹€. μ’…μ’… μ—¬λŸ¬ λͺ…령듀은 객체 μƒνƒœμ— λ”°λ₯Έ μ²˜λ¦¬λΌ μœ„ν•΄ λΉ„μŠ·ν•œ μœ ν˜•μ˜ 쑰건 μ œμ–΄μ™€ κ΄€λ ¨ν•œ μ½”λ“œλΌ κ°€μ§€κ²Œ λœλ‹€. StatePattern 은 각각의 쑰건뢄기점듀을 클래슀둜 λΆ„λ¦¬μ‹œν‚¨λ‹€. μ΄λŠ” 객체의 μƒνƒœλ“€μ„ λ‹€λ₯Έ κ°μ²΄λ‘œλΆ€ν„° λ‹€μ–‘ν•˜κ²Œ 독립적일 수 μžˆλŠ”, 고유의 κΆŒλ¦¬λΌ κ°€μ§€λŠ” κ°μ²΄λ‘œμ„œ μ·¨κΈ‰ν•˜λ„λ‘ ν•΄μ€λ‹€.

1.6. Participants

  • Context (TCPConnection)
    • ν΄λΌμ΄μ–ΈνŠΈλ“€μ΄ μ›ν•˜λŠ” μΈν„°νŽ˜μ΄μŠ€λΌ μ •μ˜ν•œλ‹€.
    • ν˜„μž¬ μƒνƒœλΌ μ •μ˜ν•˜λŠ” ConcreteState μ„œλΈŒν΄λž˜μŠ€μ˜ μΈμŠ€ν„΄μŠ€λΌ κ°€μ§„λ‹€.
  • State (TCPState)
    • Context 의 νŠΉμ • μƒνƒœμ™€ κ΄€λ ¨λœ ν–‰μœ„λ“€μ„ μΊ‘μŠν™” ν•˜κΈ° μœ„ν•œ κ΄€λ ¨ μΈν„°νŽ˜μ΄μŠ€λΌ μ •μ˜ν•œλ‹€.
  • ConcreteState subclass (TCPEstablished, TCPListen, TCPClosed)
    • 각각의 μ„œλΈŒν΄λž˜μŠ€λ“€μ€ Context의 μƒνƒœλ“€κ³Ό κ΄€λ ¨λœ ν–‰μœ„λ“€μ„ κ΅¬ν˜„ν•œλ‹€.

1.7. Collaborations

  • ContextλŠ” μƒνƒœ-ꡬ체적 request듀을 ν˜„μž¬μ˜ ConcreteState 객체에 μœ„μž„ν•œλ‹€.
  • contextλŠ” requestλΌ λ‹€λ£¨λŠ” State κ°μ²΄μ—κ²Œ μΈμžλ‘œμ„œ 자기 μžμ‹ μ„ λ„˜κΈΈ 수 μžˆλ‹€. μ΄λŠ” ν•„μš”ν•œ 경우 State κ°μ²΄λ“€λ‘œ ν•˜μ—¬κΈˆ context 에 μ ‘κ·Όν•  수 μžˆλ„λ‘ ν•΄μ€λ‹€.
  • ContextλŠ” ν΄λΌμ΄μ–ΈνŠΈμ˜ 주된 μΈν„°νŽ˜μ΄μŠ€μ΄λ‹€. ν΄λΌμ΄μ–ΈνŠΈλ“€μ€ State 객체듀과 ν•¨κ»˜ context λΌ μ„μ •ν•  수 μžˆλ‹€. 일단 contextκ°€ μ„μ •λ˜λ©΄, context 의 ν΄λΌμ΄μ–ΈνŠΈλŠ” State 객체듀을 μ§μ ‘μ μœΌλ‘œ λ‹€λ£° ν•„μš”κ°€ μ—†λ‹€.
  • Context λ‚˜ ConcreteState μ„œλΈŒν΄λž˜μŠ€λŠ” 상황에 따라 stateλΌ κ²°μ •ν•  수 μžˆλ‹€.

1.8. Consequences

StatePattern은 λ‹€μŒκ³Ό 같은 κ²°κ³ΌλΌ κ°€μ§„λ‹€.
  1. It localizes state-specific behavior and partitions bahavior for different states.
  2. It makes state transitions explicit.
  3. State objects can be shared.

1.9. Implementation

  1. Who defines the state transitions?
  2. A table-based alternative.
  3. Creating and destroying State objects.
  4. Using dynamic inheritance.

1.10. Sample Code

λ‹€μŒμ˜ μ˜ˆμ œλŠ” μ•žμ„œ Motivation μ—μ„œ μ–ΈκΈ‰ν–ˆμ—ˆλ˜ TCP μ»€λ‚΅μ…˜μ— λŒ€ν•œ C++ μ½”λ“œμ˜ μ˜ˆμ΄λ‹€. 이 μ—μ œλŠ” TCP ν”„λ‘œν† μ½œμ— λŒ€ν•΄ λ‹¨μˆœν™” μ‹œν‚¨ 것이λ€λ‘œ, TCP 컀λ„μ…˜λ“€μ˜ λͺ¨λ“  μƒνƒœλ‚˜ ν”„ν† ν† μ½œ μ „μ²΄λΌ μ„λͺ…ν•˜μ§€ μ•ŠλŠ”λ‹€. (이 μ˜ˆμ œλŠ” Lynch 와 Rose LR93 에 μ˜ν•΄ μ„λͺ…λœ TCP 컀λ„μ…˜ ν”„λ‘œν† μ½œμ— κΈ°μ΄ˆν•œ 것이닀)

일단, μš°λ¦¬λŠ” TCPConnection ν΄λž˜μŠ€λΌ μ •μ˜ν•œλ‹€. TCPConnection 은 λ°μ΄ν„°λΌ μ „λ‹¬ν•˜κ³  μƒνƒœ μ „ν™˜μ„ μœ„ν•œ requestλΌ λ‹€λ£¨λŠ” μΈν„°νŽ˜μ΄μŠ€λΌ μ œκ³΅ν•œλ‹€.

~cpp 
class TCPOctectStream;
class TCPState;

class TCPConnection {
public:
	TCPConnection ();

	void ActiveOpen ();
	void PassiveOpen ();
	void Close ();

	void Send ();
	void Acknowledge ();
	void Synchronize ();

	void ProcessOctet (TCPOctetStream* );

private:
	friend class TCPState;
	void ChangeState (TCPState* );
private:
	TCPState* _state;
};

TCPConnection 은 _state λ©€λ²„λ³€μˆ˜λΌ μ΄μš©, TCPState 의 μΈμŠ€ν„΄μŠ€λΌ μœ μ§€ν•œλ‹€. TCPState ν΄λž˜μŠ€λŠ” TCPConnection 의 μƒνƒœ-μ „ν™˜ μΈν„°νŽ˜μ΄μŠ€λΌ μ€‘λ³΅ν•˜μ—¬ 가진닀. 각각의 TCPState λͺ…령듀은 TCPConnection μΈμŠ€ν„΄μŠ€λΌ μΈμžλ‘œμ„œ μ·¨ν•˜λ©°, TCPState 둜 ν•˜μ—¬κΈˆ TCPConnection μœΌλ‘œλΆ€ν„° λ°μ΄ν„°λΌ μ ‘κ·Όν•˜κ±°λ‚˜ ν˜„μž¬ 컀λ„μ…˜μ˜ μƒνƒœλΌ μ „ν™˜ν•  수 μžˆλ„λ‘ ν•œλ‹€.


~cpp 
class TCPState {
public:
	virtual void Transmit (TCPConnection* , TCPOctetStream* ):
	virtual void ActiveOpen (TCPConnection* );
	virtual void PassiveOpen (TCPConnection* );
	virtual void Close (TCPConnection* );
	virtual void Synchronize (TCPConnection* );
	virtual void Acknowledge (TCPConnection* );
	virtual void Send (TCPConnection* );
protected:
	void ChangeState (TCPConnection* , TCPState* );
};

TCPConnection 은 μƒνƒœ-ꡬ체적 requestλ“€μœΌ TCPState μΈμŠ€ν„΄μŠ€μΈ _state 에 μœ„μž„ν•œλ‹€. TCPConnection 은 λ˜ν•œ 이 λ³€μˆ˜λΌ μƒˆλ‘œμš΄ TCPState 둜 μ „ν™˜ν•˜λŠ” λͺ…령을 μ œκ³΅ν•œλ‹€. TCPConnection 의 μƒμ„±μžλŠ” _stateλΌ TCPClosed μƒνƒœλ‘œ μ΄ˆκΈ°ν™”ν•œλ‹€. (후에 μ •μ˜λœλ‹€.)

~cpp 
TCPConnection::TCPConnection () {
	_state = TCPClosed::Instance ();
}

void TCPConnection::ChangeState (TCPState* s) {
	_state = s;
}

void TCPConnection::ActiveOpen () {
	_state->ActiveOpen (this);
}

void TCPConnection::PassiveOpen () {
	_state->PassiveOpen (this);
}

void TCPConnection::Close () {
	_state->Close (this);
}

void TCPConnection::Acknowledge () {
	_state->Acknowledge (this);
}

void TCPConnection::Synchronize () {
	_state->Synchronize (this);
}

TCPState λŠ” μœ„μž„λ°›μ€ λͺ¨λ“  request 에 λŒ€ν•œ κΈ°λ³Έ ν–‰μœ„λΌ κ΅¬ν˜„ν•œλ‹€. TCPStateλŠ” λ˜ν•œ ChnageState λͺ…λ ΉμœΌλ‘œμ¨ TCPConnection 의 μƒνƒœλΌ μ „ν™˜ν•  수 μžˆλ‹€. TCPState λŠ” TCPConnection 의 friend class 둜 μ„ μ–Έλ˜μ–΄μ§„λ‹€. 이둜써 TCPState λŠ” TCPConnection 의 λͺ…령듀에 λŒ€ν•œ μ ‘κ·Ό κΆŒν•œμ„ 가진닀.

~cpp 
void TCPState::Transmit (TCPConnection*, TCPOctetStream* ) {  }
void TCPState::ActiveOpen (TCPConnection* ) {  }
void TCPState::PassiveOpen (TCPConnection* ) {  }
void TCPState::Close (TCPConnection* ) {  }
void TCPState::Synchronize (TCPConnection* ) {  }

void TCPState::ChangeState (TCPConnection* t, TCPState* s) {
	t->ChangeState (s);
}

TCPState의 μ„œλΈŒν΄λž˜μŠ€λ“€μ€ μƒνƒœ-ꡬ체적 ν–‰μœ„λ“€μ„ κ΅¬ν˜„ν•œλ‹€. TCP 컀λ„μ…˜μ€ λ‹€μ–‘ν•œ μƒνƒœμΌ 수 μžˆλ‹€. Established, Listen, Closed λ“±λ“±. 그리고 각 μƒνƒœλ“€μ— λŒ€ν•œ TCPState 의 μ„œλΈŒν΄λž˜μŠ€λ“€μ΄ μžˆλ‹€. μ—¬κΈ°μ„œλŠ” 3개의 μ„œλΈŒν΄λž˜μŠ€λ“€μ„ λ‹€λ£° 것이닀. (TCPEstablished, TCPListen, TCPClosed)

~cpp 
class TCPEstablished : public TCPState {
public:
	static TCPState* Instance ();

	virtual void Transmit (TCPConnection* , TCPOctetStream* );
	virtual void Close (TCPConnection* );
};

class TCPListen : public TCPState {
public:
	static TCPState* Instance ();

	virtual void Send (TCPConnection* );
	// ...
};

class TCPClosed : public TCPState {
public:
	static TCPState* Instance ();

	virtual void ActiveOpen (TCPConnection* );
	virtual void PassiveOpen (TCPConnection* );
	// ...
};

TCPState μ„œλΈŒν΄λž˜μŠ€λŠ” λ‚΄λΆ€ μƒνƒœλΌ κ°€μ§€μ§€ μ•ŠλŠ”λ‹€, 그러λ€λ‘œ TCPStateλŠ” 곡유될 수 있고, 각각 단지 ν•˜λ‚˜μ˜ μΈμŠ€ν„΄μŠ€λ§Œμ΄ μš”κ΅¬λ˜μ–΄μ§„λ‹€. 이 TCPState μ„œλΈŒν΄λž˜μŠ€μ˜ 각각의 μœ μΌν•œ μΈμŠ€ν„΄μŠ€λ“€μ€ μ •μ ν•¨μˆ˜μΈ Instance 둜 얻어진닀. (TCPState μ„œλΈŒν΄λž˜μŠ€λŠ” Singleton 으둜 λ§Œλ“€μ–΄μ§„λ‹€.)

각각의 TCPState μ„œλΈŒν΄λž˜μŠ€λŠ” ν•΄λ‹Ή μƒνƒœμ— μ•Œλ§žλŠ” request 에 λŒ€ν•œ μƒνƒœ-ꡬ체적 ν–‰μœ„λ“€μ„ κ΅¬ν˜„ν•œλ‹€.

~cpp 
void TCPClosed::ActiveOpen (TCPConnection* t) {
	// send SYN, receive SYN, ACK, etc.
	
	ChangeState (t, TCPEstablished::Instance ());
}

void TCPClosed::PassiveOpen (TCPConnection* t) {
	ChangeState (t, TCPListen::Instance ());
}

void TCPEstablished::Close (TCPConnection* t) {
	// send FIN, receive ACK of FIN

	ChangeState (t, TCPListen::Instance ());
}

void TCPEstablished::Transmit (TCPConnection* t, TCPOctetStream* o) {
	t->ProcessOctet (o);
}

void TCPListen::Send (TCPConnection* t) {
	// send SYN, receive SYN, ACK, etc.

	ChangeState (t, TCPEstablished::Instance ());
}

μƒνƒœ-ꡬ체적 μž‘μ—…λ“€μ΄ μˆ˜ν–‰λœ λ’€, 이 λͺ…령듀은 TCPConnection 의 μƒνƒœλΌ μ „ν™˜ν•˜κΈ° μœ„ν•΄ ChangeState λͺ…령을 ν˜ΈμΆœν•œλ‹€. TCPConnection 은 TCP 컀λ„μ…˜ ν”„λ‘œν† μ½œμ— λŒ€ν•΄ λͺ¨λ₯Έλ‹€. TCP에 λŒ€ν•œ 각각의 μƒνƒœμ „ν™˜κ³Ό 행동듀을 μ •μ˜ν•˜λŠ” 것은 TCPState μ„œλΈŒν΄λž˜μŠ€λ“€μ΄λ‹€.

1.11. Known Uses

Johnson an Zweig JZ91 은 StatePattern κ³Ό TCP 컀λ„μ…˜ ν”„λ‘œν† μ½œλ‘œ μ–΄ν”Œλ¦¬μΌ€μ΄μ…˜μ˜ νŠΉμ„±μ„ λ‚˜νƒ€λ‚Έλ‹€.

λŒ€λΆ€λΆ„μ˜ λŒ€μ€‘μ μΈ μƒν˜Έμž‘μš©μ μΈ λ“œλ‘œμž‰ ν”„λ‘œκ·Έλž¨λ“€μ€ 직접 μ‘°μž‘ν•˜μ—¬ λͺ…령을 μˆ˜ν–‰ν•˜λŠ” 'tool' 을 μ œκ³΅ν•œλ‹€. μ˜ˆλΌ λ“€μ–΄, line-drawing tool 은 μ‚¬μš©μžκ°€ 클릭 & λ“œλ ˆκ·Έ ν•¨μœΌλ‘œμ„œ μƒˆ 선을 그릴 수 μžˆλ„λ‘ ν•΄μ€λ‹€. selection tool 은 μ‚¬μš©μžκ°€ λ„ν˜•μ„ 선택할 수 있게 ν•΄μ€λ‹€. 보톡 μ΄λŸ¬ν•œ νˆ΄λ“€μ˜ palette (μΌμ’…μ˜ λ„κ΅¬μƒμž νŒ¨λ„)λΌ μ œκ³΅ν•œλ‹€. μ‚¬μš©μžλŠ” μ΄λŸ¬ν•œ 행동을 'tool을 μ„ νƒν•œ λ’€ μ„ νƒν•œ tool을 μ΄μš©ν•œλ‹€' 라고 μƒκ°ν•œλ‹€. ν•˜μ§€λ§Œ, μ‹€μ œλ‘œλŠ” editor 의 ν–‰μœ„κ°€ ν˜„μž¬ μ„ νƒν•œ tool둜 μ „ν™˜λ˜λŠ” 것이닀. drawing tool 이 ν™œμ„±ν™” λ˜μ—ˆμ„ λ•Œ μš°λ¦¬λŠ” λ„ν˜•μ„ 그리고 selection tool 이 ν™œμ„±ν™” λ˜μ—ˆμ„ λ•Œ λ„ν˜•μ„ 선택할 수 μžˆλŠ” 식이닀. μš°λ¦¬λŠ” ν˜„μž¬ μ„ νƒλœ tool 에 λ”°λ₯Έ editor 의 ν–‰μœ„λΌ μ „ν™˜μ‹œν‚€λŠ” 뢀뢄에 λŒ€ν•΄ StatePattern 을 μ΄μš©ν•  수 μžˆλ‹€.

툴-ꡬ체적 ν–‰μœ„λΌ κ΅¬ν˜„ν•˜λŠ” μ„œλΈŒν΄λž˜μŠ€λΌ μ •μ˜ν•˜λŠ” 곳에 λŒ€ν•΄ Tool 좔상 ν΄λž˜μŠ€λΌ μ •μ˜ν•  수 μžˆλ‹€. drawing editor λŠ” currentTool κ°μ²΄λΌ κ°€μ§€λ©°, requestλΌ μ΄ 객체에 μœ„μž„μ‹œν‚¨λ‹€. μ‚¬μš©μžκ°€ μƒˆ toolλΌ κ³¨λžμ„ λ•Œ, drawing editor λŠ” ν–‰μœ„λΌ μ „ν™˜ν•΄μ•Ό ν•˜λ€λ‘œ λ”°λΌμ„œ 이 κ°μ²΄λŠ” κ΅μ²΄λœλ‹€.

이 방법은 HowDraw Joh92와 Unidraw VL90 drawing editor ν”„λ ˆμž„μ›Œν¬μ— μ΄μš©λ˜μ—ˆλ‹€. μ΄λŠ” ν΄λΌμ΄μ–ΈνŠΈλ‘œ ν•˜μ—¬κΈˆ μƒˆλ‘œμš΄ μ’…λ₯˜μ˜ tool듀을 μ‰½κ²Œ μ •μ˜ν•  수 μžˆλ„λ‘ ν•΄μ€λ‹€. HowDraw μ—μ„œ DrawingController ν΄λž˜μŠ€λŠ” currentTool κ°μ²΄μ—κ²Œ requestλΌ λ„˜κΈ΄λ‹€. UniDrawμ—μ„œλŠ” 각각 Viewer 와 Tool ν΄λž˜μŠ€κ°€ 이와 같은 κ΄€κ³„λΌ κ°€μ§„λ‹€. λ‹€μŒμ˜ 클래슀 λ‹€μ΄μ–΄κ·Έλž¨μ€ Tool κ³Ό DrawingController μΈν„°νŽ˜μ΄μŠ€μ— λŒ€ν•œ μ„λͺ…이닀.


Coplien's Envelope-Letter idiom Cop92 λŠ” State 와 κ΄€λ ¨λ˜μ–΄μžˆλ‹€. Envelope-Letter λŠ” run-time μ‹œμ— 객체의 ν΄λž˜μŠ€λΌ μ „ν™˜ν•˜λŠ” 방법이닀. StatePattern 은 더 ꡬ체적이며, 객체의 μƒνƒœμ— κ·Έ ν–‰μœ„κ°€ 의μ±μ μΌλ•Œμ— λ‹€λ£¨λŠ” 방법에 촛점을 λ§žμΆ˜λ‹€.

1.12. Related Patterns

  • FlyweightPattern 은 State객체듀이 μ–Έμ œ μ–΄λ–»κ²Œ κ³΅μœ λ˜λŠ”μ§€ ν‘œν˜„ν•œλ‹€.
  • Stateκ°μ²΄λŠ” μ’…μ’… SingletonPattern 으둜 κ΅¬ν˜„λœλ‹€.


Valid XHTML 1.0! Valid CSS! powered by MoniWiki
last modified 2021-02-07 05:23:18
Processing time 0.0451 sec