디자인 모드: 상태 모드 (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. 디자인 모델 독서 노트 - – 상태 모델
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
디자인 모델 의 공장 모델, 단일 모델자바 는 23 가지 디자인 모델 (프로 그래 밍 사상/프로 그래 밍 방식) 이 있 습 니 다. 공장 모드 하나의 공장 류 를 만들어 같은 인 터 페 이 스 를 실현 한 일부 종 류 를 인 스 턴 스 로 만 드 는 것...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.