當乙個物件的內在狀態改變時允許改變其行為,這個物件看起來像是改變了其類。
狀態模式把物件的行為包裝在不同的狀態物件裡,每乙個狀態物件都有乙個共同抽象狀態基類。狀態模式的意圖是讓乙個物件在其內部狀態改變的時候其行為也隨之改變。
1)乙個物件的行為取決於它的狀態,並且它必須在執行時根據狀態改變它的行為。
2)**中包含大量與物件狀態有關的條件語句,例如乙個操作中含有龐大的多分支語句,且這些分支依賴於該物件的狀態。
將電視的狀態分為開機和關機狀態,在開機狀態下遙控器可以切換頻道,調整音量,此時重複按開機鍵是無效的;在關機狀態下,頻道切換、調解音量關機鍵都是無效的,只有按開機才會生效。
普通實現:
//遙控器通過state欄位來儲存電視機的狀態,各個操作根據state欄位的狀態來判斷是否執行。隨著後期狀態或者功能增加,就要不斷維護if...else 語句,**會變得重複切混亂。我們用狀態模式來改造它。public class tvcontroller
state = power_on;
}//關機按鈕
public void poweroff()
state = power_off;
}//切換頻道
public void changechannel()else
}//調節音量
public void turnvoice()else }}
//定義電視功能介面輸出:inte***ce tvstate
//關機狀態 所用功能都無效
class poweroffstate implements tvstate
@override
public void turnvoice()
}//開機狀態
class poweronstate implements tvstate
@override
public void turnvoice()
}//狀態介面
inte***ce powercontroller
//遙控器
class tvcontorller implements powercontroller
@override
public void poweron()
@override
public void poweroff()
//切換頻道
public void changechannal()
public void turnvoice()
}public class statemode
}
優點:將所有與乙個特定的狀態相關的行為都放在乙個狀態物件中,它提供了乙個更好的方法來組織與特定狀態相關的**,將繁瑣的狀態判斷轉換成結構清晰的狀態類族,在避免**膨脹的同時也保證了拓展性和可維護性。
缺點:會增加系統類和物件的個數。
設計模式 狀態模式
狀態模式 當乙個物件的內在狀態改變時允許改變其行為,這個物件看起來像是改變了其類。狀態模式主要解決的是當控制乙個物件狀態轉換的條件表示式過於複雜時的情況,把狀態的判斷邏輯轉移到表示不同狀態的一些列類當中,可以把複雜的判斷邏輯簡化。當乙個物件的行為取決於它的狀態,並且它必須在執行時刻根據狀態改變它的行...
設計模式 狀態模式
1.概述 當乙個物件的內在狀態改變時允許改變其行為,這個物件看起來像是改變了其類。2.解決的問題 主要解決的是當控制乙個物件狀態轉換的條件表示式過於複雜時的情況。把狀態的判斷邏輯轉移到表示不同的一系列類當中,可以把複雜的邏輯判斷簡單化。3.模式中的角色 3.1 上下文環境 context 它定義了客...
設計模式 狀態模式
描述 允許物件在內部狀態改變時改變它的行為,物件看起來好像修改了它的類。主要解決的是當控制乙個物件狀態轉換的條件表示式過於複雜時的情況。把狀態的判斷邏輯轉移到表示不同的一系列類當中,可以把複雜的邏輯判斷簡單化。通常應用在有好多狀態的流程中。類圖 以下程式模擬糖果機器投幣取糖果的狀態流程。1.定義狀態...