當乙個物件的內在狀態改版的時候,允許改變其行為,這個物件看起來像是改變了其類。簡單來說就是我們在程式設計的時候可能會根據物件的狀態去寫很多的判斷語句if else。那麼狀態模式就是將判斷的語句封裝到乙個物件中,這樣對於擴充套件和改變狀態的判斷都非常的方便。
汽車我們都知道有油箱,但是對於油箱還有多少的油量這個就是某種狀態。對於常規的**實現要判斷油箱的狀態是使用if-else語句來實現的。
package com.rabbit.pattern.state;
/** * created by hasee on 2018/4/5.
*/public class carstate else if (l >= 50 && l < 100) else if (l >= 10 && l < 50) else }}
@test
public void test()
這樣簡單的幾個狀態就需要使用這麼長的if-else語句來判斷,並且如果新增了其它狀態,那麼是需要修改這個類的。
如何解決這類問題呢?如果我們將判斷的邏輯封裝到乙個類中,那麼就可以輕鬆的增加判斷的邏輯條件了。這其實就是設計模式中的狀態模式,就是根據物件的某個狀態去處理不同的邏輯。
使用狀態模式的**實現。
package com.rabbit.pattern.state;
/** * created by hasee on 2018/4/5.
*/public class car
public void nowstate()
public void setoil(double oil)
public string getname()
public double getoil()
}
抽象的邏輯類
package com.rabbit.pattern.state;
/** * created by hasee on 2018/4/5.
*/public abstract class state
具體的條件邏輯
package com.rabbit.pattern.state;
/** * created by hasee on 2018/4/5.
*/public class state100 extends state else }}
package com.rabbit.pattern.state;
/** * created by hasee on 2018/4/5.
*/public class state50 extends state else }}
package com.rabbit.pattern.state;
/** * created by hasee on 2018/4/5.
*/public class state10 extends state else }}
package com.rabbit.pattern.state;
/** * created by hasee on 2018/4/5.
*/public class state0 extends state else }}
@test
public void test1()
使用了狀態模式後,我們將邏輯條件的判斷封裝到類中,以後需要新增其它邏輯的時候只需要擴充套件state類,並且修改邏輯順序即可。
1、封裝了轉換規則。
2、列舉可能的狀態,在列舉狀態之前需要確定狀態種類。
3、將所有與某個狀態有關的行為放到乙個類中,並且可以方便地增加新的狀態,只需要改變物件狀態即可改變物件的行為。
4、允許狀態轉換邏輯與狀態物件合成一體,而不是某乙個巨大的條件語句塊。
5、可以讓多個環境物件共享乙個狀態物件,從而減少系統中物件的個數。
1、狀態模式的使用必然會增加系統類和物件的個數。
2、狀態模式的結構與實現都較為複雜,如果使用不當將導致程式結構和**的混亂。
3、狀態模式對
"開閉原則
"的支援並不太好,對於可以切換狀態的狀態模式,增加新的狀態類需要修改那些負責狀態轉換的源**,否則無法切換到新增狀態,而且修改某個狀態類的行為也需修改對應類的源**。
1、行為隨狀態改變而改變的場景。
2、條件、分支語句的代替者。
Android設計模式(十三) 狀態模式
1 定義 當乙個物件內在狀態轉變時,允許改變其行為,這個物件看起來改變了其類 2 優點 將與特定狀態相關的行為區域性化,並且將不同狀態的行為分割開來 3 目的 消除龐大的條件分支語句 4 使用 當乙個物件的行為取決於它的狀態,並且它在執行時刻必須根據狀態改變它的行為時,就可以考慮狀態模式 5 描述 ...
十三 狀態模式
狀態模式,當乙個物件的內在狀態改變時允許改變其行為,這個物件看起來像是改變了其類。狀態模式主要解決的是當控制乙個物件狀態轉換的條件表示式過於複雜時的情況。把狀態的判斷邏輯轉移到表示不同狀態的一系列類當中。state public abstract class statestatea public c...
設計模式之狀態模式
一 作用 允許乙個物件在其內部狀態改變時改變它的行為,物件看起來似乎修改了它的類。其別名為狀態物件 objects for states 狀態模式是一種物件行為型模式。二 例子 狀態抽象類 abstract class state 具體狀態類,每個狀態對應乙個類 class concretestat...