狀態模式
定義: 狀態模式允許對象在內部狀態改變時改變它的行爲,實例化的對象看起來好像修改了它的類。
當代碼中包含大量與對象狀態有關的條件語句時,或行爲隨狀態改變而改變的場景,就可以用狀態模式去解決。
狀態,顧名思義,就是狀態。。,可以表示一個類中的狀態,也不僅僅是狀態,也包括行爲的。
比如飛機的三種狀態:沒有動力,沒在飛行,正在飛行。
基本結構
狀態模式的類圖如下:
從結構上看,主要就是將項目中變化的部分抽出來,提煉出狀態接口後,然後將各個狀態抽去,並去實現接口,每個狀態都有相應的行爲,但是做法不一樣。
基本使用
以上面說的飛機狀態爲例,首先還是創建接口。
public interface State {
public void fly();
public void stopfly();
public void up();
public void down();
}
然後是具體狀態實現類
public class StateFlying implements State {
@Override
public void fly() {
System.out.println("alread flying");
}
@Override
public void stopfly() {
System.out.println("stopflying");
}
@Override
public void up() {
System.out.println("start up ...");
}
@Override
public void down() {
System.out.println("start down ...");
}
}
最後Context類去使用上面的類
public class PlaneContext {
private State state;
public PlaneContext() {
state = null;
}
public void setState(State state) {
this.state = state;
}
public void fly() {
System.out.println("PlaneContext: fly");
this.state.fly();
}
...
}
buttonrd.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
planeContext.setState(stateNotPower);
test();
Toast.makeText(MainActivity.this, "測試無動力狀態", Toast.LENGTH_SHORT).show();
}
最後使用時,直接在mainactivity中,去setstate不同的具體狀態類,即可調用到相應的方法。
這樣最大的好處就是沒有那些if…else之類的語句了,也方便擴展。