【設計模式】20、狀態模式


 

 1 package com.shejimoshi.behavioral.State;
2
3
4 /**
5 * 功能:狀態接口
6 * 時間:2016年3月8日下午9:41:17
7 * 作者:cutter_point
8 */
9 public interface State
10 {
11 /**
12 * 當前狀態應該干嘛
13 * @param w
14 */
15 public abstract void writeProgram(Work w);
16 }

 

 1 package com.shejimoshi.behavioral.State;
2
3
4 /**
5 * 功能:上午工作的狀態
6 * 時間:2016年3月8日下午9:44:41
7 * 作者:cutter_point
8 */
9 public class ForenoonState implements State
10 {
11
12 @Override
13 public void writeProgram(Work w)
14 {
15 if(w.getHour() < 12)
16 {
17 System.out.println("當前時間:" + w.getHour() + "點上午工作, 精神百倍");
18 }
19 else
20 {
21 //設置下一個狀態
22 w.setState(new NoonState());
23 //工作內容
24 w.writeProgram(); //通過這個來調用當前的狀態然后遞歸下去
25 }
26 }
27
28 }

 

 1 package com.shejimoshi.behavioral.State;
2
3
4 /**
5 * 功能:中午
6 * 時間:2016年3月8日下午9:52:25
7 * 作者:cutter_point
8 */
9 public class NoonState implements State
10 {
11
12 @Override
13 public void writeProgram(Work w)
14 {
15 if(w.getHour() < 13)
16 {
17 System.out.println("當前時間:" + w.getHour() + "點, 餓了, 午飯;犯困,午休。");
18 }
19 else
20 {
21 //設定下一個工作
22 w.setState(new AfternoonState());
23 //開始工作狀態
24 w.writeProgram();
25 }
26 }
27
28 }

 

 1 package com.shejimoshi.behavioral.State;
2
3
4 /**
5 * 功能:下午工作
6 * 時間:2016年3月8日下午9:52:58
7 * 作者:cutter_point
8 */
9 public class AfternoonState implements State
10 {
11
12 @Override
13 public void writeProgram(Work w)
14 {
15 if(w.getHour() < 17)
16 {
17 System.out.println("當前時間:" + w.getHour() + "點, 下午狀態不錯,加油努力");
18 }
19 else
20 {
21 w.setState(new EveningState());
22 w.writeProgram();
23 }
24 }
25
26 }

 

 1 package com.shejimoshi.behavioral.State;
2
3
4 /**
5 * 功能:晚上加班
6 * 時間:2016年3月8日下午9:53:17
7 * 作者:cutter_point
8 */
9 public class EveningState implements State
10 {
11
12 @Override
13 public void writeProgram(Work w)
14 {
15 if(w.isFinish())
16 {
17 w.setState(new RestState());
18 w.writeProgram();
19 }
20 else
21 {
22 if(w.getHour() < 21)
23 {
24 System.out.println("當前時間:" + w.getHour() + "點,加班哦, 疲累之極");
25 }
26 else
27 {
28 w.setState(new SleepingState());
29 w.writeProgram();
30 }
31 }
32 }
33
34 }

 

 1 package com.shejimoshi.behavioral.State;
2
3
4 /**
5 * 功能:睡眠狀態
6 * 時間:2016年3月8日下午9:53:55
7 * 作者:cutter_point
8 */
9 public class SleepingState implements State
10 {
11
12 @Override
13 public void writeProgram(Work w)
14 {
15 System.out.println("當前時間:" + w.getHour() + "點, 不行了,睡着了。");
16 }
17
18 }

 

 1 package com.shejimoshi.behavioral.State;
2
3
4 /**
5 * 功能:下班休息狀態
6 * 時間:2016年3月8日下午9:54:19
7 * 作者:cutter_point
8 */
9 public class RestState implements State
10 {
11
12 @Override
13 public void writeProgram(Work w)
14 {
15 System.out.println("當前時間:" + w.getHour() + "點,下班啦,回家收衣服去啦");
16 }
17
18 }

 

 1 package com.shejimoshi.behavioral.State;
2
3
4 /**
5 * 功能:工作事件
6 * 時間:2016年3月8日下午9:42:45
7 * 作者:cutter_point
8 */
9 public class Work
10 {
11 /**
12 * 當前狀態
13 */
14 private State current;
15
16 /**
17 * 時間
18 */
19 private double hour;
20
21 private boolean finish;
22
23 public boolean isFinish()
24 {
25 return finish;
26 }
27
28 public void setFinish(boolean finish)
29 {
30 this.finish = finish;
31 }
32
33 public Work(State s)
34 {
35 this.current = s;
36 }
37
38 public double getHour()
39 {
40 return hour;
41 }
42
43 public void setHour(double hour)
44 {
45 this.hour = hour;
46 }
47
48 public void setState(State current)
49 {
50 this.current = current;
51 }
52
53 public void writeProgram()
54 {
55 current.writeProgram(this);
56 }
57
58 }

 

 1 package com.shejimoshi.behavioral.State;
2
3
4 /**
5 * 功能:允許一個對象在其內部狀態改變它的行為。對象看起來似乎修改了它的類
6 * 適用:一個對象的行為取決於它的狀態,並且它必須在運行時刻根據狀態改變它的行為
7 * 一個操作中含有龐大的多分支的條件語句,並且這些分支依賴於該對象的狀態。這個狀態通常用一個或多個枚舉常量表示。
8 * 通常,有多個操作包含這一相同的條件結構。State模式將每一個分支放入一個獨立的類中。這使得你可以根據對象自身
9 * 的情況將對象的狀態作為一個對象,這一對象,這一對象可以不依賴於其他對象而獨立變化
10 * 時間:2016年3月8日下午8:26:26
11 * 作者:cutter_point
12 */
13 public class Test
14 {
15 public static void main(String[] args)
16 {
17 Work work = new Work(new ForenoonState());
18 work.setHour(9);
19 work.writeProgram();
20 work.setHour(10);
21 work.writeProgram();
22 work.setHour(12);
23 work.writeProgram();
24 work.setHour(13);
25 work.writeProgram();
26 work.setHour(14);
27 work.writeProgram();
28 work.setHour(17);
29 work.writeProgram();
30
31 //下班
32 //work.setFinish(true);
33 work.setFinish(false);
34
35 work.writeProgram();
36 work.setHour(19);
37 work.writeProgram();
38 work.setHour(22);
39 work.writeProgram();
40
41
42 }
43 }

 

測試結果:

當前時間:9.0點上午工作, 精神百倍
當前時間:10.0點上午工作, 精神百倍
當前時間:12.0點, 餓了, 午飯;犯困,午休。
當前時間:13.0點, 下午狀態不錯,加油努力
當前時間:14.0點, 下午狀態不錯,加油努力
當前時間:17.0點,加班哦, 疲累之極
當前時間:17.0點,加班哦, 疲累之極
當前時間:19.0點,加班哦, 疲累之極
當前時間:22.0點, 不行了,睡着了。

  

 


注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
粤ICP备14056181号  © 2014-2021 ITdaan.com