前言
Android的設計模式系列文章介紹,歡迎關注,持續更新中:
Android的設計模式-設計模式的六大原則
一句話總結23種設計模式則
創建型模式:
Android的設計模式-單例模式
Android的設計模式-建造者模式
Android的設計模式-工廠方法模式
Android的設計模式-簡單工廠模式
Android的設計模式-抽象工廠模式
Android的設計模式-原型模式
行為型模式:
Android的設計模式-策略模式
Android的設計模式-狀態模式
Android的設計模式-責任鏈模式
Android的設計模式-觀察者模式
Android的設計模式-模板方法模式
Android的設計模式-迭代器模式
Android的設計模式-備忘錄模式
Android的設計模式-訪問者模式
Android的設計模式-中介者模式
Android的設計模式-解釋器模式
Android的設計模式-命令模式
結構型模式:
Android的設計模式-代理模式
Android的設計模式-組合模式
Android的設計模式-適配器模式
Android的設計模式-裝飾者模式
Android的設計模式-享元模式
Android的設計模式-外觀模式
Android的設計模式-橋接模式
1.定義
當一個對象的內在狀態改變時允許改變其行為,這個對象看起來像是改變了其類。
2.介紹
- 狀態模式屬于行為型模式
- 狀態模式中的行為是由狀態來決定的,即不同狀態下的行為也不同。
- 狀態模式的結構跟策略模式的幾乎一樣,但其本質是不一樣的。策略模式中的行為是彼此獨立,能夠相互替換的;而狀態模式的行為是平行的,,不同狀態下其行為也是不一樣的,具有不可替換性。
3.UML類圖
3.1 角色說明:
- State(抽象狀態角色):抽象類或者接口,定義對象的各種狀態和行為。
- ConcreteState(具體狀態角色):實現抽象角色類,定義了本狀態下的行為,即要做的事情。
- Context(環境角色):定義客戶端需要的接口,并且負責具體狀態的切換。
4.實現
繼續以舉追妹紙為例,單身狗狀態下與戀愛狀態下的行為是不一致的。
4.1 創建抽象狀態類
定義公共接口,比如定義一個人的行為有看電影和逛街:
public interface PersonState {
void movies();//看電影
void shopping();//逛街
}
4.2 創建具體狀態類
實現抽象狀態類的接口,比如人有單身狗和戀愛這兩種狀態:
public class DogState implements PersonState {//單身狗狀態
@Override
public void movies() {
System.out.println("一個人偷偷看島國大片");
}
@Override
public void shopping() {
//單身狗逛條毛街啊
//空實現
}
}
public class LoveState implements PersonState {//戀愛狀態
@Override
public void movies() {
System.out.println("一起上電影院看大片~");
}
@Override
public void shopping() {
System.out.println("一起愉快的逛街去~");
}
}
4.3 創建環境類
定義客戶端需要的接口,以及負責狀態的切換:
public class Context {
private PersonState mPersonState;
public void setPersonState(PersonState personState) {
mPersonState = personState;
}
public void fallInLove() {
System.out.println("戀愛了,陷入熱戀狀態:");
setPersonState(new LoveState());
}
public void disappointmentInLove() {
System.out.println("失戀了,變成單身狗狀態:");
setPersonState(new DogState());
}
public void movies() {
mPersonState.movies();
}
public void shopping() {
mPersonState.shopping();
}
}
4.4 測試方法
public void test() {
Context context = new Context();
context.fallInLove();
context.shopping();
context.movies();
context.disappointmentInLove();
context.shopping();
context.movies();
}
輸出結果:
戀愛了,陷入熱戀狀態:
一起愉快的逛街去~
一起上電影院看大片~
失戀了,變成單身狗狀態:
一個人偷偷看島國大片
5. 應用場景
- 對象的行為取決于其狀態,隨著狀態改變時其行為也需改變
- 包含大量的與狀態相關的條件判斷語句時
6. 優點
- 每個狀態都是一個子類,易于擴展和維護。
- 避免過多的條件語句,使得結構更清晰,提高代碼的可維護性。
7. 缺點
- 可能會導致狀態子類會過多
相關文章閱讀
Android的設計模式-設計模式的六大原則
一句話總結23種設計模式則
創建型模式:
Android的設計模式-單例模式
Android的設計模式-建造者模式
Android的設計模式-工廠方法模式
Android的設計模式-簡單工廠模式
Android的設計模式-抽象工廠模式
Android的設計模式-原型模式
行為型模式:
Android的設計模式-策略模式
Android的設計模式-狀態模式
Android的設計模式-責任鏈模式
Android的設計模式-觀察者模式
Android的設計模式-模板方法模式
Android的設計模式-迭代器模式
Android的設計模式-備忘錄模式
Android的設計模式-訪問者模式
Android的設計模式-中介者模式
Android的設計模式-解釋器模式
Android的設計模式-命令模式
結構型模式:
Android的設計模式-代理模式
Android的設計模式-組合模式
Android的設計模式-適配器模式
Android的設計模式-裝飾者模式
Android的設計模式-享元模式
Android的設計模式-外觀模式
Android的設計模式-橋接模式