定義:當一個對象的內存狀態改變時允許改變其行爲,這個對象看起來像日改變了其煩類。
主要解決的是當控制一個對象狀態轉換的條件表達式過於複雜時的情況。把狀態的判斷邏輯轉移到表示不同狀態的系列類當中,可以把複雜的判斷邏輯簡化。如果判斷很簡單,那就沒必要了
例子說話
首先定義一個虛基類,定義當前任務的方法
public abstract class State
{
public abstract void writeProgram(Work w);
}
工作啦,有當前狀態/當前時間/當前完成狀況,此例子中,上午是不能完成任務的,
public class Work
{
private State current;
private double hour;
private boolean finish = false;
public Work()
{
this.current = new ForennoState();
}
public double getHour()
{
return hour;
}
public void setHour(double hour)
{
this.hour = hour;
}
public boolean isFinish()
{
return finish;
}
public void setFinish(boolean finish)
{
this.finish = finish;
}
public void setState(State s)
{
this.current = s;
}
public void writeProgram()
{
this.current.writeProgram(this);
}
}
起始狀態,
public class ForennoState extends State
{
// 9點上班開始
@Override
public void writeProgram(Work w)
{
if (w.getHour() < 12)
{
System.out.println("當前時間" + w.getHour() + "點 上午工作,精神百倍");
}
else
{
w.setState(new NoonState());
w.writeProgram();
}
}
}
一箇中間狀態
public class NoonState extends State
{
@Override
public void writeProgram(Work w)
{
if (w.getHour() < 13)
{
System.out.println("當前時間" + w.getHour() + "點 餓了,午飯:犯困,午休");
}
else
{
w.setState(new AfternoonState());
w.writeProgram();
}
}
}
另一箇中間狀態
public class AfternoonState extends State
{
@Override
public void writeProgram(Work w)
{
if (w.getHour() <= 17)
{
System.out.println("當前時間" + w.getHour() + "點 下午狀態還不錯,緯線努力");
}
else
{
w.setState(new EvenintState());
w.writeProgram();
}
}
}
還是一箇中間狀態
public class EvenintState extends State
{
@Override
public void writeProgram(Work w)
{
if (w.isFinish())
{
w.setState(new RestState());
w.writeProgram();
}
else
{
if (w.getHour() < 21)
{
System.out.println("當前時間" + w.getHour() + "點 加班哦,疲累之極");
}
else
{
w.setState(new SleepingState());
w.writeProgram();
}
}
}
}
一個結束狀態
public class RestState extends State
{
@Override
public void writeProgram(Work w)
{
System.out.println("當前時間" + w.getHour() + "點 下班");
}
}
另一個結束狀態
public class SleepingState extends State
{
@Override
public void writeProgram(Work w)
{
System.out.println("當前時間" + w.getHour() + "點不行了,睡覺");
}
}
客戶端代碼就簡單了
public class StateMain
{
public static void main(String[] args)
{
Work w = new Work();
w.setHour(9);
w.writeProgram();
w.setHour(10);
w.writeProgram();
w.setHour(12);
w.writeProgram();
w.setHour(13);
w.writeProgram();
w.setHour(14);
w.writeProgram();
w.setHour(17);
w.writeProgram();
w.setFinish(true);
w.setHour(19);
w.writeProgram();
w.setHour(22);
w.writeProgram();
}
}
總結,此模式主要對大量判斷當前狀態時有效,將不同的狀態分成不同的類去實現,讓類之間去做下個類的交互,減輕客戶端調用時的複雜度。客戶端在使用時,只需要知道當前時間即可,其他就交給各個類去實現