1.State模式 - xiaoniudonghe2015/Android-Java-Code-Style GitHub Wiki
1.步骤
1.首先要创建各状态的父类(DoorState),构造函数中传入状态的对象(Door)(改变状态时候调用)
2.创建各个状态类(DoorOpening,DoorOpen,DoorClosing,DoorClosed),重写相应的方法,方法中切换状态
3.创建状态对象类(Door),该类中也拥有所有方法,创建各个状态的对象,写成final变量的形式,方法体中由state对象调用,以调用对应的方法.(状态改变时,state对象改变,指向下一个状态的对象,调用对应的方法)
2.代码
状态父类
public abstract class DoorState {
protected Door door;
public abstract void touch();
public void complete() {
}
public void timeout() {
}
public String status() {
String s = getClass().getName();
return s.substring(s.lastIndexOf('.') + 1);
}
public DoorState(Door door) {
this.door = door;
}
}
各子类
public class DoorOpening extends DoorState {
public DoorOpening(Door door) {
super(door);
}
@Override
public void touch() {
}
@Override
public void timeout() {
door.setState(door.CLOSING);
}
public void complete() {
door.setState(door.OPEN);
}
}
public class DoorOpen extends DoorState {
public DoorOpen(Door door) {
super(door);
}
@Override
public void touch() {
door.setState(door.CLOSING);
}
}
public class DoorClosing extends DoorState {
public DoorClosing(Door door) {
super(door);
}
@Override
public void complete() {
door.setState(door.CLOSED);
}
@Override
public void timeout() {
door.setState(door.OPEN);
}
@Override
public void touch() {
}
}
public class DoorClosed extends DoorState {
public DoorClosed(Door door) {
super(door);
}
@Override
public void touch() {
door.setState(door.OPENING);
}
}
Door对象
public class Door extends Observable {
public final DoorState CLOSED = new DoorClosed(this);
public final DoorState CLOSING = new DoorClosing(this);
public final DoorState OPEN = new DoorOpen(this);
public final DoorState OPENING = new DoorOpening(this);
public final DoorState STAYOPEN = new DoorStayOpen(this);
private DoorState state = CLOSED;
public void touch() {
state.touch();
}
public void complete() {
state.complete();
}
public void timeout() {
state.timeout();
}
public String status() {
return state.status();
}
protected void setState(DoorState state) {
this.state = state;
setChanged();
notifyObservers();
}
}
public class DoorTest {
private static DoorTest sInstance = null;
private static Context sContext = null;
public static void setApplicationContext(Context ctx){
sContext = ctx;
}
public static synchronized DoorTest getInstance() {
if(sContext == null){
return null;
}
if (sInstance == null) {
sInstance = new DoorTest();
}
return sInstance;
}
public void test() {
Door door = new Door();
//1. 初始状态
System.out.println(door.status());
//2. 转移到Opening状态
door.touch();
System.out.println(door.status());
//3. 转移到Open状态
door.complete();
System.out.println(door.status());
//4. 转移到Closing状态
door.touch();
System.out.println(door.status());
//5. 回到Closed状态
door.complete();
System.out.println(door.status());
}
}