用於解決系統中複雜對象的狀態轉換以及不一樣狀態下行爲的封裝問題。ide
結構:測試
(1)Context 環境類spa
環境類中維護一個 State 對象,它定義了當前的狀態。線程
(2)State 抽象狀態類code
(3)ConcreteState 具體狀態類對象
每個類封裝了一個狀態對應的行爲。blog
酒店系統中,房間的狀態變化:接口
(1)空閒狀態開發
(2)已預訂狀態class
(3)已入住狀態
當遇到須要頻繁修改狀態的情況時,就能夠考慮使用狀態模式。
1 /** 2 * 狀態接口 3 * @author CL 4 * 5 */ 6 public interface State { 7 void handle(); 8 }
1 /** 2 * 房間空閒狀態 3 * @author CL 4 * 5 */ 6 public class FreeState implements State { 7 8 @Override 9 public void handle() { 10 System.out.println("房間空閒,能夠預約!"); 11 } 12 13 }
1 /** 2 * 房間預約狀態 3 * @author CL 4 * 5 */ 6 public class BookedState implements State { 7 8 @Override 9 public void handle() { 10 System.out.println("房間已預訂,能夠入住!"); 11 } 12 13 }
1 /** 2 * 房間已入住狀態 3 * @author CL 4 * 5 */ 6 public class CheckedInState implements State { 7 8 @Override 9 public void handle() { 10 System.out.println("房間已入住,不能預約!"); 11 } 12 13 }
測試:
1 /** 2 * 測試狀態模式 3 * @author CL 4 * 5 */ 6 public class Client { 7 8 public static void main(String[] args) { 9 HomeContext hc = new HomeContext(); 10 11 //修改成空閒狀態 12 hc.setState(new FreeState()); 13 14 //修改成已預訂狀態 15 hc.setState(new BookedState()); 16 17 //修改成已入住狀態 18 hc.setState(new CheckedInState()); 19 } 20 }
控制檯輸出:
修改狀態:房間空閒,能夠預約!
修改狀態:房間已預訂,能夠入住!
修改狀態:房間已入住,不能預約!
(1)銀行系統中帳號狀態的管理;
(2)OA 系統中公文狀態的管理;
(3)酒店系統中,房間狀態的管理;
(4)線程對象各狀態之間的切換;
(5)…………