1 状态模式适合状态的改变影响行为厂家,普通设计一般通过switch来达到效果,但是从可扩张性的角度来讲违背了开放–封闭原则,状态模式通过将不同状态分离出去成类,可以把复杂的判断逻辑简化。
接口:
public abstract class State {
public abstract void writeProgram(Work w);
}
三中状态:
public class MorningState extends State{
@Override
public void writeProgram(Work w) {
// TODO Auto-generated method stub
if(w.getHour()<12){
System.out.println(w.getHour()+"精神百倍");
}else{
//更改工作时间状态
w.setState(new NoonState());
w.writeProgram();//回到Work类中,向下执行
}
}
}
public class NoonState extends State{
@Override
public void writeProgram(Work w) {
// TODO Auto-generated method stub
if(w.getHour()<16){
System.out.println(w.getHour()+"有点困");
}else{
w.setState(new AfternoonState());
w.writeProgram();//回到Work类中,向下执行
}
}
}
public class AfternoonState extends State {
@Override
public void writeProgram(Work w) {
// TODO Auto-generated method stub
System.out.println("下班回家");
}
}
工作类,因为将各个状态分离出去了,所以没有显得很庞大:
public class Work {
private double hour;
private State state;
public Work() {
this.state=new MorningState();
}
public void writeProgram(){
state.writeProgram(this);
}
public State getState() {
return state;
}
public void setState(State state) {
this.state = state;
}
public double getHour() {
return hour;
}
public void setHour(double hour) {
this.hour = hour;
}
}
测试:
public class TextMain {
public static void main(String[] arge){
Work work=new Work();
work.setHour(9);
work.writeProgram();
work.setHour(14);
work.writeProgram();
work.setHour(17);
work.writeProgram();
}
}
参考《大话设计模式》