一探膊、定義
當一個對象內在狀態(tài)改變時允許其改變行為颗圣,這個對象看起來像改變了其類拷获。狀態(tài)模式的核心是封裝篮撑,狀態(tài)的變更引起了行為的變更,從外部看起來就好像這個對象對應的類發(fā)生了改變一樣匆瓜。
- 優(yōu)點:結構清晰赢笨,避免了過多的switch...case或者if...else語句的使用;每個狀態(tài)都是一個子類陕壹,你要增加狀態(tài)就要增加子類质欲。要修改狀態(tài),你只修改一個子類就可以了糠馆;封裝性非常好嘶伟,狀態(tài)變換放置到類的內部來實現(xiàn),外部的調用不用知道類內部如何實現(xiàn)狀態(tài)和行為的變換又碌。
- 缺點:子類會太多九昧,也就是類膨脹。
二毕匀、實現(xiàn)
public class Client {
public static void main(String[] args){
//定義環(huán)境角色
Context context = new Context();
//初始化狀態(tài)
context.setCurrentState(new ConcreteState1());
//行為執(zhí)行
context.handle1();
context.handle2();
}
}
//抽象狀態(tài)角色,提供所有狀態(tài)的抽象行為铸鹰,并且封裝環(huán)境角色以實現(xiàn)狀態(tài)切換。
abstract class State {
//定義一個環(huán)境角色皂岔,提供子類訪問
protected Context context;
//設置環(huán)境角色
public void setContext(Context context){
this.context = context;
}
//行為1
public abstract void handle1();
//行為2
public abstract void handle2();
}
//具體狀態(tài)角色,每一個具體狀態(tài)必須完成兩個職責:狀態(tài)下要做的事情蹋笼,以及本狀態(tài)如何過渡到其他狀態(tài)。
class ConcreteState1 extends State {
@Override
public void handle1() {
//本狀態(tài)下必須處理的邏輯
System.out.println("狀態(tài)1");
}
@Override
public void handle2() {
//設置當前狀態(tài)為state2
super.context.setCurrentState(Context.STATE2);
//過渡到state2狀態(tài)躁垛,由Context實現(xiàn)
super.context.handle2();
}
}
class ConcreteState2 extends State {
@Override
public void handle1() {
//設置當前狀態(tài)為state1
super.context.setCurrentState(Context.STATE1);
//過渡到state1狀態(tài)剖毯,由Context實現(xiàn)
super.context.handle1();
}
@Override
public void handle2() {
//本狀態(tài)下必須處理的邏輯
System.out.println("狀態(tài)2");
}
}
//環(huán)境角色,定義客戶端需要的接口,并且負責具體狀態(tài)的切換教馆。
class Context {
//定義狀態(tài)
public final static State STATE1 = new ConcreteState1();
public final static State STATE2 = new ConcreteState2();
//當前狀態(tài)
private State CurrentState;
//獲得當前狀態(tài)
public State getCurrentState() {
return CurrentState;
}
//設置當前狀態(tài)
public void setCurrentState(State currentState) {
this.CurrentState = currentState;
//切換狀態(tài)
this.CurrentState.setContext(this);
}
//行為委托
public void handle1(){
this.CurrentState.handle1();
}
public void handle2(){
this.CurrentState.handle2();
}
}