定義:當一個對象的内在狀态改變時允許改變其行為,這個對象看起來像是改變了其類
結構:就是在把所有情況拆分成多個類,在調用時把這些類分别set進去。
場景:在玩lol時 有攻擊,行走,技能使用,那麼按照狀态模式分,就分為正常時三個行為的狀态,被控制是這三個行為的狀态,被眩暈時這三個行為的狀态。
優點:1.減少if else的使用
2.減少耦合度,是擴充更容易
缺點:使類增多,結構變複雜。
類圖:

Context
1. public classs 我{
2.
3. private Grade grade;
4.
5. public void setGrade(Grade grade) {
6. this.grade= grade;
7. }
8. //打扮
9. void dressUp(
10. grade.dressUp();
11. );
12.
13. //娛樂
14. void entertainment(Grade grade){
15. grade.dressUp();
16. }
17.
18. //買車
19. void buyCar(
20. grade.buyCar();
21. );
22.
23.
24. }
政策接口
1. public interface Grade(
2.
3. public void dressUp();
4.
5. public void entertainment();
6.
7. public void buyCar();
8.
9. )
政策實作
1. public class has10 implements Grade{
2.
3. public void dressUp(){
4. system.out.print("10塊錢,來個跨欄背心得了")
5. }
6.
7. public void entertainment(){
8. system.out.print("10塊錢保健啥,洗個澡吧")
9. }
10.
11. public void buyCar(){
12. system.out.print("10塊錢,坐公交吧")
13. }
14.
15. }
1. public class has100 implements Grade{
2.
3. public void dressUp(){
4. system.out.print("100塊錢,來個山寨耐克")
5. }
6.
7. public void entertainment(){
8. system.out.print("100塊錢,按個腳吧")
9. }
10.
11. public void buyCar(){
12. system.out.print("100塊錢,打車!")
13. }
14. }
1. public class has1000 implements Grade{
2.
3. public void dressUp(){
4. system.out.print("1000塊錢,來個正品的361度")
5. }
6.
7. public void entertainment(){
8. system.out.print("1000塊錢,來個大保健,正經的")
9. }
10.
11. public void buyCar(){
12. system.out.print("1000塊錢,租車!")
13. }
14. }
調用
1. public static void main(String[] args) {
2. 我 me = new 我();
3. me.setGrade(new has10());
4. me.entertainment();
5. me.dressUp();
6. me.setGrade(new has100());
7. me.entertainment();
8. }