前言:在漫长的实验三过去之后,经历了无数的踩坑之后总算是完成了,因而再次分几个部分记录一下遇到的问题及解决方案
状态(State)模式
这是我们在开发程序时候会经常遇到的事情,一个程序在不同的上下文环境中,不同的方法可能会有不同的返回值,或者是对于某些方法,在部分状态中实现,而在另一些状态中则不予实现。因而我们就需要实现状态模式的开发。
在此见要说明一下状态模式的设计过程:
首先我们需要抽象出一个状态类,考虑到程序中所有与状态有关的方法(主要为状态转移方法),全部在这个类中完成抽象方法的定义(在我的设计模式中,该类方法返回值全部为Boolean,目的是在不同的具体状态中,如果该方法不需要实现,则可以直接返回false)。然后在总结出程序所处的所有不同状态,归为子状态类,全部承接前文提到的抽象状态类分别实现即可。最后只要在我们的程序中定义State变量就可以实现自己设计的状态模式啦。
拿本次实验举例子:
public interface State<R> {
public abstract boolean AllocatedPlanningEntry(CommonPlanningEntry entry, List<R> resources);
public abstract boolean StartPlanningEntry(CommonPlanningEntry entry);
public abstract boolean BlockPlanningEntry(CommonPlanningEntry entry);
public abstract boolean FinishPlanningEntry(CommonPlanningEntry entry);
public abstract boolean CancelPlanningEntry(CommonPlanningEntry entry);
public String getState();
}
这是抽象的State类中定义的全部抽象方法。
public class WAITING<R> implements State<R> {
@Override
public boolean AllocatedPlanningEntry(CommonPlanningEntry entry, List<R> resources) {
entry.AllocateResource(resources);
entry.SetEntryState(new ALLOCATED());
return true;
}
@Override
public boolean StartPlanningEntry(CommonPlanningEntry entry) {
return false;
}
@Override
public boolean BlockPlanningEntry(CommonPlanningEntry entry) {
return false;
}
@Override
public boolean FinishPlanningEntry(CommonPlanningEntry entry) {
return false;
}
@Override
public boolean CancelPlanningEntry(CommonPlanningEntry entry) {
entry.SetEntryState(new CANCELLED());
return true;
}
@Override
public String getState() {
return "等待中";
}
}
以WAITING状态为例,需要实现的方法具体实现,不需要实现的方法直接return false即可。
private State state ;
public State getEntryState(){
return this.state;
}
public void SetEntryState(State state){
this.state=state;
}
@Override
public boolean ALLOCATED(List<R> resources) {
return this.state.AllocatedPlanningEntry(this,resources);
}
@Override
public boolean BLOCKED() {
return this.state.BlockPlanningEntry(this);
}
@Override
public boolean CANCELLED() {
return this.state.CancelPlanningEntry(this);
}
@Override
public boolean RUNNING() {
return this.state.StartPlanningEntry(this);
}
@Override
public boolean ENDED() {
return this.state.FinishPlanningEntry(this);
}
在需要设置状态的程序中定义状态变量,实现得到状态和修改状态的方法。最后在constructor中将其初始化为初始状态即可。
this.SetEntryState(new WAITING());
这样,简单的状态模式就设计完成了~