State Design [상태 디자인]

  1. Design Object [디자인목적]

    1. 객체 내부 상태에 따라 다른 상태 객체를 적용 가능.
    2. 상태마다 같은 함수를 부르는 것 처럼 보이지만, 다른 객체의 정의된 함수를 호
    3. 상태에 따른 객체를 선언할 수 있어, 유연하게 대처 가
  2. Options [대안들]

  3. Benefit [디자인 장점]

    1. 상태값에 따른 객체가 변경되므로, 유연한 구축 가능
  4. Structure & Sample Code [구조와 샘플코드]

    1) TCP Connection에 따른 상태변화 처리

    1. UML

    2. 구조
      -> TCPConnection : 상태클래스 TCPConnectionState를 실행할 객체

      최초 상태에서 생성되는 멤버변수는 ClosedTCPConnectionState
      

      -> TCPConnectionState : TCP 상태 클래스의 인터페이스
      -> ClosedTCPConnectionState / OpenTCPConnectionState

      각 상태에 대한 구현체이며, 상태변화시 생성자에 connection을 담아 생성됨.  
      또한 구현된 함수를 TCPConnection에서 실행할 수 있도록 각 상태별 기능 구현
      
  5. Source code

    1. 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");
    }
}

results matching ""

    No results matching ""