允许一个对象在其内部状态改变时改变它的行为。对象看起来似乎修改了他的类
state是一个接口,定义了基本操作,concreteState是不同状态,其中的方法表示在当前状态下,不同操作的实现。context中,通过改变state来使得调用不同状态的方法
优点
1、封装了转换规则。
2、枚举可能的状态,在枚举状态之前需要确定状态种类。
3、将所有与某个状态有关的行为放到一个类中,并且可以方便地增加新的状态,只需要改变对象状态即可改变对象的行为。
4、允许状态转换逻辑与状态对象合成一体,而不是某一个巨大的条件语句块。
5、可以让多个环境对象共享一个状态对象,从而减少系统中对象的个数。
缺点
1、状态模式的使用必然会增加系统类和对象的个数。
2、状态模式的结构与实现都较为复杂,如果使用不当将导致程序结构和代码的混乱。
3、状态模式对“开闭原则”的支持并不太好,对于可以切换状态的状态模式,增加新的状态类需要修改那些负责状态转换的源代码,否则无法切换到新增状态;而且修改某个状态类的行为也需修改对应类的源代码。
模式适用场景
1、对象的行为依赖于它的状态(属性)并且可以根据它的状态改变而改变它的相关行为。
2、代码中包含大量与对象状态有关的条件语句
代码
Main
public class Main {
public static void main(String[] args) {
Room room=new Room();
System.out.println("===预定房间====");
room.bookRoom();
System.out.println("====入住====");
room.checkIn();
System.out.println("====退房====");
room.checkOut();
Room room01=new Room();
System.out.println("====直接退房=====");
room01.checkOut();
System.out.println("=====直接退订=====");
room01.unsubscribe();
System.out.println("====直接入住====");
room01.checkIn();
}
}
interface:State
public interface State {
public boolean bookRoom();
public boolean unsubscribeRoom();
public boolean checkIn();
public boolean checkOut();
}
imp:Room
public class Room {
State free,booked,checkIn;
State state;
public Room(){
free=new free(this);
booked=new booked(this);
checkIn=new checkIn(this);
state=free;
System.out.println(free);
System.out.println(booked);
System.out.println(checkIn);
System.out.println(state);
}
public State getFree() {
return free;
}
public void setFree(State free) {
this.free = free;
}
public State getBooked() {
return booked;
}
public void setBooked(State booked) {
this.booked = booked;
}
public State getCheckIn() {
return checkIn;
}
public void setCheckIn(State checkIn) {
this.checkIn = checkIn;
}
public State getState() {
return state;
}
public void setState(State state) {
this.state = state;
}
public boolean bookRoom(){
state.bookRoom();
return true;
}
public boolean unsubscribe(){
state.unsubscribeRoom();
return true;
}
public boolean checkIn(){
state.checkIn();
return true;
}
public boolean checkOut(){
state.checkOut();
return true;
}
}
imp:booked
public class booked implements State {
private Room roomManager;
public booked(Room roomManager) {
this.roomManager=roomManager;
}
@Override
public boolean bookRoom() {
System.out.println("已被预订");
return false;
}
@Override
public boolean unsubscribeRoom() {
System.out.println("退订成功");
roomManager.setState(roomManager.getFree());
return true;
}
@Override
public boolean checkIn() {
System.out.println("入住成功");
roomManager.setState(roomManager.getCheckIn());
return true;
}
@Override
public boolean checkOut() {
System.out.println("尚未入住");
return false;
}
}
imp:checkIn
public class checkIn implements State {
private Room roomManager;
public checkIn(Room roomManager) {
this.roomManager=roomManager;
}
@Override
public boolean bookRoom() {
System.out.println("已有入住");
return false;
}
@Override
public boolean unsubscribeRoom() {
System.out.println("已有入住");
return false;
}
@Override
public boolean checkIn() {
System.out.println("已有入住");
return false;
}
@Override
public boolean checkOut() {
System.out.println("退房成功");
roomManager.setState(roomManager.getFree());
return true;
}
}
imp:free
public class free implements State {
private Room roomManager;
public free(Room roomManager) {
this.roomManager=roomManager;
}
@Override
public boolean bookRoom() {
System.out.println("预定成功");
roomManager.setState(roomManager.getBooked());
return true;
}
@Override
public boolean unsubscribeRoom() {
System.out.println("尚未预定");
return false;
}
@Override
public boolean checkIn() {
System.out.println("入住成功");
roomManager.setState(roomManager.getCheckIn());
return true;
}
@Override
public boolean checkOut() {
System.out.println("尚未入住");
return false;
}
}