디자인 모드: 상태 모드 (State)

13018 단어 디자인 모드
대상 이 내부 상태 가 바 뀔 때 행동 을 바 꿀 수 있 도록 합 니 다.대상 이 종 류 를 수정 한 것 처럼 보인다.
상태 모드 의 역할 1. 환경 캐릭터 Context): 문맥 이 라 고도 부 르 고 클 라 이언 트 가 관심 이 있 는 인 터 페 이 스 를 정의 하 며 구체 적 인 상태 류 의 인 스 턴 스 를 유지 합 니 다.이 구체 적 인 상태 클래스 의 인 스 턴 스 는 이 환경 대상 의 기 존 상 태 를 보 여 줍 니 다.2. 추상 적 인 상태 역할 (State): 인 터 페 이 스 를 정의 하고 환경 대상 의 특정한 상태 에 대응 하 는 행 위 를 봉인 한다.3. 구체 적 인 상태 캐릭터 (Concretestate): 모든 구체 적 인 상태 류 는 환경 (Context) 의 한 상태 에 대응 하 는 행 위 를 실현 했다.
사례 는 호텔 예약 을 예 로 들 면 방 의 상 태 는 한가, 예약, 입주 이다.그러면 빈 방 의 상 태 는 예약, 입주 로 바 뀔 수 있다.예 약 된 상태 에서 방 의 상 태 는 입주, 예약 취소 로 바 뀔 수 있다.이미 입주 한 방 의 상 태 는 체크아웃 1 상태 인터페이스 State 로 바 꿀 수 있 습 니 다.
public interface State
{
    public void bookRoom();
    public void unsubscribeRoom();
    public void checkInRoom();
    public void checkOutRoom();
}

2. 방 류 룸 (환경 캐릭터)
public class Room
{
    private State freeTimeState;
    private State checkInState;
    private State bookedState;

    private State state;

    public Room()
    {
        freeTimeState = new FreeTimeState(this);
        checkInState = new CheckInState(this);
        bookedState = new BookedState(this);
        state = freeTimeState;
    }

    public void bookRoom()
    {
        state.bookRoom();
    }
    public void unsubscribeRoom()
    {
        state.unsubscribeRoom();
    }
    public void checkInRoom()
    {
        state.checkInRoom();
    }
    public void checkOutRoom()
    {
        state.checkOutRoom();
    }

    public String toString()
    {
        return "       :"+getState().getClass().getName();
    }

    public State getFreeTimeState()
    {
        return freeTimeState;
    }

    public void setFreeTimeState(State freeTimeState)
    {
        this.freeTimeState = freeTimeState;
    }

    public State getCheckInState()
    {
        return checkInState;
    }

    public void setCheckInState(State checkInState)
    {
        this.checkInState = checkInState;
    }

    public State getBookedState()
    {
        return bookedState;
    }

    public void setBookedState(State bookedState)
    {
        this.bookedState = bookedState;
    }

    public State getState()
    {
        return state;
    }

    public void setState(State state)
    {
        this.state = state;
    }
}

3. 방 상태 (구체 적 인 상태 캐릭터) 남 은 상태
public class FreeTimeState implements State {
    private Room hotelManagement;

    public FreeTimeState(Room hotelManagement)
    {
        this.hotelManagement = hotelManagement;
    }
    @Override
    public void bookRoom()
    {
        System.out.println("        !");
        this.hotelManagement.setState(this.hotelManagement.getBookedState());
    }

    @Override
    public void unsubscribeRoom()
    {
    }

    @Override
    public void checkInRoom()
    {
        System.out.println("      !");
        this.hotelManagement.setState(this.hotelManagement.getCheckInState());
    }

    @Override
    public void checkOutRoom()
    {
    }
}

입주 상태
public class CheckInState implements State {
    private Room hotelManagement;

    public CheckInState(Room hotelManagement)
    {
        this.hotelManagement = hotelManagement;
    }
    @Override
    public void bookRoom()
    {
        System.out.println("        ");
    }

    @Override
    public void unsubscribeRoom()
    {
    }

    @Override
    public void checkInRoom()
    {
        System.out.println("        ");
    }

    @Override
    public void checkOutRoom()
    {
        System.out.println("    ");
        this.hotelManagement.setState(this.hotelManagement.getFreeTimeState());
    }
}

예약 상태
public class BookedState implements State {
    private Room hotelManagement;

    public BookedState(Room hotelManagement)
    {
        this.hotelManagement = hotelManagement;
    }

    @Override
    public void bookRoom()
    {
        System.out.println("        ");
    }

    @Override
    public void unsubscribeRoom()
    {
        System.out.println("    ");
        this.hotelManagement.setState(this.hotelManagement.getFreeTimeState());
    }

    @Override
    public void checkInRoom()
    {
        System.out.println("    ");
        this.hotelManagement.setState(this.hotelManagement.getCheckInState());
    }

    @Override
    public void checkOutRoom()
    {
    }
}

4 테스트 코드
        Room[] rooms = new Room[2];
        for(int i=0;i<rooms.length;i++)
        {
            rooms[i] = new Room();
        }

        rooms[0].bookRoom();
        rooms[0].checkInRoom();
        rooms[0].bookRoom();
        System.out.println(rooms[0]);
        System.out.println("-------------");

        rooms[1].checkInRoom();
        rooms[1].bookRoom();
        rooms[1].checkOutRoom();
        rooms[1].bookRoom();
        System.out.println(rooms[1]);

출력:
       :design.state.CheckInState -------------
      !
        
    
        !
       :design.state.BookedState

장단 점 장점: 1. 전환 규칙 을 봉 했다.2. 가능 한 상 태 를 매 거 하기 전에 상태 종 류 를 확인 해 야 합 니 다.3. 특정한 상태 와 관련 된 모든 행 위 를 하나의 유형 에 넣 고 새로운 상 태 를 편리 하 게 증가 시 킬 수 있 으 며 대상 의 상 태 를 바 꾸 기만 하면 대상 의 행 위 를 바 꿀 수 있다.4. 커 다란 조건문 블록 이 아 닌 상태 전환 논리 와 상태 대상 을 하나 로 합성 할 수 있 습 니 다.단점: 1. 상태 모델 의 사용 은 반드시 시스템 류 의 대상 의 개 수 를 증가 시 킬 것 이다. 2. 상태 모델 의 구조 와 실현 이 비교적 복잡 하 다. 만약 에 부당 하 게 사용 하면 프로그램 구조 와 코드 의 혼란 을 초래 할 것 이다.3. 상태 모드 는 '개폐 원칙' 에 대한 지원 이 좋 지 않 습 니 다. 상 태 를 전환 할 수 있 는 상태 모드 에 대해 새로운 상태 류 를 추가 하려 면 상태 전환 을 담당 하 는 소스 코드 를 수정 해 야 합 니 다. 그렇지 않 으 면 새로 추 가 된 상태 로 전환 할 수 없습니다.또한 어떤 상태 클래스 를 수정 하 는 행위 도 해당 클래스 의 소스 코드 를 수정 해 야 한다.
장면 1. 대상 의 행 위 는 그의 상태 (속성) 에 의존 하고 그의 상태 에 따라 관련 행 위 를 바 꿀 수 있다. 2. 코드 에는 대상 상태 와 관련 된 조건 문 이 대량으로 포함 되 어 있다.
JDK 의 상태 모드: java. util. Iterator javax. faces. lifecycle. LifeCycle \ # execute ()
참고 자료 1. 23 가지 디자인 모델 2. 세부 JDK 의 디자인 모델 3. 디자인 모델 독서 노트 - – 상태 모델

좋은 웹페이지 즐겨찾기