设计模式(一)state模式
什么是state模式?
在实验三中计划项有多种状态,而且对于不同计划项,其状态也有所不同,如果直接使用判断语句来进行状态的变化,写出的代码回非常臃肿,复用性和扩展性很差。对于这种状态比较多的情况,我们就要使用state模式。所谓state模式,就是允许对象在内部状态发生改变时改变自己行为的模式。如果代码中含有大量的与对象状态有关的if-else判断语句时,我们可以考虑使用状态模式。
状态模式有什么优点?
1.避免大量使用判断语句,可以使代码简洁,易读
2.将所有的与状态有关的行为都放在一个类中,便于增加新的状态。
3封装了转换规则
4复用性强,可以让多个环境同时使用一种状态。
状态模式的实现
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-iQgYrAeG-1594281446461)(C:\Users\fengqingyang\AppData\Roaming\Typora\typora-user-images\image-20200709133248572.png)]
下面来看一个例子
以酒店预订房间为例,房间状态有空闲,预订,入住
状态接口
public interface State
{
public void bookRoom();
public void unsubscribeRoom();
public void checkInRoom();
public void checkOutRoom();
}
空闲状态
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()
{
}
}
环境类(房间)
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;
}
}