Java設計模式——狀態模式

【點擊領取】阿里雲代金券 | 阿里雲優惠券 |阿里雲優惠碼|雲服務器|阿里雲|阿里雲代金券 – 限時領取1888元阿里雲代金券

狀態(State)模式又稱爲狀態對象模式(Pattern of Objects for State),狀態模式是對象的行爲模式。狀態模式容許一個對象在其內部狀態改變時改變其行爲,用於解決系統中複雜對象的狀態裝換以及不一樣狀態下行爲的封裝問題。 服務器

狀態和行爲:   ide

所謂對象的狀態,一般指的就是對象實例的屬性的值;而行爲指的就是對象的功能,再具體點說,行爲大多能夠對應到方法上。   ui

狀態模式的功能就是分離狀態的行爲,經過維護狀態的變化,來調用不一樣狀態對應的不一樣功能。也就是說,狀態和行爲是相關聯的,它們的關係能夠描述爲:狀態決定行爲。  阿里雲

因爲狀態是在運行期被改變的,所以行爲也會在運行期根據狀態的改變而改變。
spa

2、場景舉例

在一個酒店系統中,房間的狀態變化:code

  • 空閒
  • 已預訂
  • 已入住

这里写图片描述

如當前房間狀態須要頻繁的修改狀態時,能夠考慮使用狀態模式。
cdn

3、模式結構

模式結構圖:这里写图片描述
htm

  • State抽象狀態類:定義了一個接口,用以封裝環境(Context)對象的一個特定狀態的行爲。
  • ConcreteState具體狀態類:實現抽象狀態接口,實現了一個狀態對應的行爲。
  • Context環境類:環境類中維護了一個State對象,它是定義了當前的狀態。

示例代碼:

抽象狀態類:

public interface State{
     void handle();
}    

複製代碼

具體狀態類: 

public class FreeState implements State{
     @Override
     public void handle(){
        System.out.println("房間空閒");
    } }   



/**
 * 預約狀態
 */
public class OrderedState implements State{
     @Override
     public void handle(){
        System.out.println("房間已被預訂");    
    }
}


/**
 * 入住狀態
 */
public class LivedState implements State{
     @Override
     public void handle() {
        System.out.println("房間已入住");
    } } 複製代碼

Context環境類:

public class Context {
     private State state;

     public void setState(State  s ){
        System.out.println("房間狀態已被修改");
         state = s;
         state.handle();

    } }    

複製代碼

客戶端:

public class Client {
     public static void main(String[] args) {
        Context context=new Context();
         context.setState(new FreeState());
         context.setState(new OrderedState());
         context.setState(new LivedState());
    }
}  


//輸出結果
房間狀態已被修改
房間空閒
房間狀態已被修改
房間已被預訂
房間狀態已被修改
房間已入住   

複製代碼

4、總結

  • 在狀態模式中,環境(Context)是持有狀態的對象,可是環境(Context)自身並不處理跟狀態相關的行爲,而是把處理狀態的功能委託給了狀態對應的狀態處理類來處理。 
  • 在具體的狀態處理類中常常須要獲取環境(Context)自身的數據,甚至在必要的時候會回調環境(Context)的方法,所以,一般將環境(Context)自身看成一個參數傳遞給具體的狀態處理類 
  • 客戶端通常只和環境(Context)交互。客戶端能夠用狀態對象來配置一個環境(Context),一旦配置完畢,就再也不須要和狀態對象打交道了。客戶端一般不負責運行期間狀態的維護,也不負責決定後續到底使用哪個具體的狀態處理對象。 
相關文章
相關標籤/搜索