State Design [상태 디자인]
Design Object [디자인목적]
- 객체 내부 상태에 따라 다른 상태 객체를 적용 가능.
- 상태마다 같은 함수를 부르는 것 처럼 보이지만, 다른 객체의 정의된 함수를 호
- 상태에 따른 객체를 선언할 수 있어, 유연하게 대처 가
Options [대안들]
Benefit [디자인 장점]
- 상태값에 따른 객체가 변경되므로, 유연한 구축 가능
Structure & Sample Code [구조와 샘플코드]
1) TCP Connection에 따른 상태변화 처리
UML
구조
-> TCPConnection : 상태클래스 TCPConnectionState를 실행할 객체최초 상태에서 생성되는 멤버변수는 ClosedTCPConnectionState
-> TCPConnectionState : TCP 상태 클래스의 인터페이스
-> ClosedTCPConnectionState / OpenTCPConnectionState각 상태에 대한 구현체이며, 상태변화시 생성자에 connection을 담아 생성됨. 또한 구현된 함수를 TCPConnection에서 실행할 수 있도록 각 상태별 기능 구현
Source code
- Client
public class Client {
public static void main(String[] args) throws Exception {
TCPConnection connection = new TCPConnection();
connection.open();
connection.acknowledge();
connection.close();
//connection.acknowledge();
}
}
- TCPConnection
public class TCPConnection {
private TCPConnectionState tcpConnectionState = new ClosedTCPConnectionState(this);
public void open(){
tcpConnectionState.open();
}
public void close(){
tcpConnectionState.close();
}
public void acknowledge() throws Exception {
tcpConnectionState.acknowledge();
}
public void setTcpConnectionState(TCPConnectionState tcpConnectionState) {
this.tcpConnectionState = tcpConnectionState;
}
}
- TCPConnectionState<Interface>
public interface TCPConnectionState {
void open();
void close();
void acknowledge() throws Exception;
}
- OpenTCPConnectionState
public class OpenTCPConnectionState implements TCPConnectionState{
private TCPConnection connection;
public OpenTCPConnectionState(TCPConnection connection) {
this.connection = connection;
}
@Override
public void open() {
System.out.println("Reinitializing connection");
}
@Override
public void close() {
connection.setTcpConnectionState(new ClosedTCPConnectionState(connection));
System.out.println("Closing connection");
}
@Override
public void acknowledge() throws Exception {
System.out.println("Acknowledge");
}
}
- ClosedTCPConnectionState
public class ClosedTCPConnectionState implements TCPConnectionState{
private TCPConnection connection;
public ClosedTCPConnectionState(TCPConnection connection) {
this.connection = connection;
}
@Override
public void open() {
System.out.println("Opening connection");
connection.setTcpConnectionState(new OpenTCPConnectionState(connection));
}
@Override
public void close() {
System.out.println("Already closed connection");
}
@Override
public void acknowledge() throws Exception {
throw new Exception("Invalid usasage of connection");
}
}