状态模式
当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了它的类。
- 状态模式解决的是当控制一个对象状态转换的条件表达式过于复杂时的情况。把状态的判断逻辑转移到表示不同状态的一系列类当中,可以把复杂的判断逻辑简化。
- 优点:将与特定状态相关的行为局部化,并且将不同状态的行为分割开来,可以消除庞大的条件分支语句。
- 当一个对象的行为取决于它的状态,并且它必须在运行时刻根据状态改变它的行为时,就可以考虑使用状态模式。
代码结构
State类:抽象状态类,定义一个接口来封装与Context的一个特定状态相关的行为。
abstract class State{
public abstract void Handle(Context context);
}
ConcreteState类:具体状态,每一个子类实现一个与Context的一个状态相关的行为。
class ConcreteStateA extends State{
public void Handle(Context context){
context.State = new ConcreteStateB();
}
}
class ConcreteStateB extends State{
public void Handle(Context context){
context.State = new ConcreteStateA();
}
}
Context类:维护一个ConcreteState子类的实例
class Context{
private State state;
public Context(State state){
this.state = state;
}
//省略set get方法
public void Request(){
state.Handle();
}
}
具体优化实例:
// 未使用状态模式的工作状态类
class Work{
private int hour;
private boolean finish = false;
public int getHour() {
return hour;
}
public void setHour(int hour) {
this.hour = hour;
}
public boolean isFinish() {
return finish;
}
public void setFinish(boolean finish) {
this.finish = finish;
}
public void WriteProgram(){
if(hour<12){
System.out.println("当前时间"+hour+"点 上午工作,精神百倍!");
}
else if(hour<13){
System.out.println("当前时间"+hour+"点 饿了,午饭;犯困休息!");
}else if(hour<17){
System.out.println("当前时间"+hour+"点 下午状态还不错,继续努力!");
}else {
if(finish){
System.out.println("当前时间"+hour+"点 下班回家了!");
}else {
if(hour<21){
System.out.println("当前时间"+hour+"点 加班,疲惫至极!");
}else {
System.out.println("当前时间"+hour+"点 不行了,睡着了!");
}
}
}
}
}
使用工作模式的如上工作类:
//工作
class Work{
private State current;
public Work(){
current = new ForenoonState();
}
private double hour;
private boolean finish = false;
public boolean isFinish() {
return finish;
}
public void setFinish(boolean finish) {
this.finish = finish;
}
public double getHour() {
return hour;
}
public void setHour(double hour) {
this.hour = hour;
}
public void SetState(State s){
current = s;
}
public void WriteProgram(){
current.WriteProgram(this);
}
}
//抽象状态
abstract class State{
public abstract void WriteProgram(Work w);
}
//工作状态表
class ForenoonState extends State{
public void WriteProgram(Work work){
if(work.getHour()<12){
System.out.println("当前时间"+work.getHour()+"点 上午工作,精神百倍!");
}else {
work.SetState(new NoonState());
work.WriteProgram();
}
}
}
class NoonState extends State{
public void WriteProgram(Work work){
if(work.getHour()<13){
System.out.println("当前时间"+work.getHour()+"点 饿了,午饭;犯困休息!");
}else {
work.SetState(new AfterNoonState());
work.WriteProgram();
}
}
}
class AfterNoonState extends State{
public void WriteProgram(Work work){
if(work.getHour()<17){
System.out.println("当前时间"+work.getHour()+"点 下午状态还不错,继续努力!");
}else {
work.SetState(new EveningState());
work.WriteProgram();
}
}
}
class EveningState extends State{
public void WriteProgram(Work work){
if(work.isFinish()){
work.SetState(new RestState());
work.WriteProgram();
}
else {
if(work.getHour()<21){
System.out.println("当前时间"+work.getHour()+"点 加班,疲惫至极!");
}else {
work.SetState(new SleepingState());
work.WriteProgram();
}
}
}
}
class SleepingState extends State{
public void WriteProgram(Work work){
System.out.println("当前时间"+work.getHour()+"点 不行了,睡着了!");
}
}
class RestState extends State{
public void WriteProgram(Work work){
System.out.println("当前时间"+work.getHour()+"点 下班回家了!");
}
}