天天看點

狀态模式

定義:當一個對象的内在狀态改變時允許改變其行為,這個對象看起來像是改變了其類

結構:就是在把所有情況拆分成多個類,在調用時把這些類分别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.        }      

繼續閱讀