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

来源:http://www.cnblogs.com/cutter-point/archive/2016/03/08/5256198.html
-Advertisement-
Play Games

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 /


 

 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點, 不行了,睡著了。

  

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 介紹 現在有兩派,有的人建議使用設計模式,有的人不建議使用設計模式!這就向寫文章一樣,有的人喜歡文章按照套路走,比如敘事性質的文章,時間,地點,人物,事件。而有的人喜歡寫雜文或者散文,有的人喜歡寫詩詞!現在寫代碼很多地方類似於寫文章,但是在有些地方比寫文章需要更多的技能!寫文章寫多了一般也能寫出優秀
  • 問題描述:如何將獲取一個浮點數的整數部分以及小數部分 方法一: 1 #include <iostream> 2 using namespace std; 3 4 void main() 5 { 6 float f = -23.04f; 7 int i = f; 8 float ff = f - i;
  • 一、網路編程中兩個主要的問題 一個是如何準確的定位網路上一臺或多台主機,另一個就是找到主機後如何可靠高效的進行數據傳輸。 在TCP/IP協議中IP層主要負責網路主機的定位,數據傳輸的路由,由IP地址可以唯一地確定Internet上的一臺主機。 而TCP層則提供面嚮應用的可靠(tcp)的或非可靠(UD
  • Mark一下,安裝rgdal後是不能使用gdal的功能的,比如如下代碼會報錯: sds <- get_subdatasets(hdfpath) 錯誤是 unable to find "gdal", 這時需要下載gdal核心文件並且安裝,下載網址如下: http://www.gisinternals.
  • 5-JEESZ分散式框架-CentOs下安裝Tomcat7(環境準備)
  • 首先什麼是shiro? shiro是apache下麵的一個開源項目,下麵是其網站上對其的一段說明: Apache Shiro is a powerful and easy-to-use Java security framework that performs authentication, aut
  • Dubbo是一個分散式服務框架,致力於提供高性能和透明化的RPC遠程服務調用方案,以及SOA服務治理方案。簡單的說,dubbo就是個服務框架,如果沒有分散式的需求,其實是不需要用的,只有在分散式的時候,才有dubbo這樣的分散式服務框架的需求,並且本質上是個服務調用的東東,說白了就是個遠程服務調用的...
  • 首先在CentOs下下載jdk7解壓文件,tar包安裝(目前Oracle官方上,對於文件的下載,加了Cookie驗證機制,所以直接下載文件包,會出 現找不到的錯誤,最老土的辦法,本地下載,使用FTP上傳伺服器),我這邊已經下載好了,通過ssh已經上傳到指定的目錄,這裡直接講解安裝的過程。
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...