(《設計模式解析與實戰》讀書筆記)
一、定義
當乙個物件的內在狀態改變時允許改變其行為,這個物件看起來像是改變了其類。也就是說行為由狀態決定,不同的狀態下有不同的行為。
二、使用場景
(1)乙個物件的行為取決於它的狀態,並且它必須在執行時根據狀態改變它的行為;
(2)**中包含大量與物件狀態有關的條件語句。例如,乙個操作中含有龐大的多分支語句,且這些分支依賴於該物件的狀態。
三、簡單示例
比如說電視有開關機兩種狀態,遙控器上的功能根據電視機狀態不同,相應的表現出不同的行為,若電視關機,那麼除了開機鍵以外,其他鍵都不管用,而開機後,重複按開機鍵,開機鍵表現無效。
未使用狀態模式的**:
/**
*/public
class tvcontroller
}public
void
poweroff()
}public
void
nextchannel() else
}public
void
prevchannel() else
}public
void
turnup() else
}public
void
turndown() else }}
可以看出上面的**使用了大量的if-else語句,**顯得臃腫。
使用狀態模式解決這個問題:
/**
* 電視狀態介面,定義了電視操作的函式
*/public
inte***ce
tvstate
/**
* 開機狀態,此時再觸發開機功能不做任何操作
*/public
class
poweronstate
implements
tvstate
@override
public
void
prevchannel()
@override
public
void
turnup()
@override
public
void
turndown()
}
/**
* 關機狀態,此時只有開機功能是有效的
*/public
class
poweroffstate
implements
tvstate
@override
public
void
prevchannel()
@override
public
void
turnup()
@override
public
void
turndown()
}
/**
* 電源操作介面
*/public
inte***ce
powercontroller
/**
* 電視遙控器
*/public
class
tvcontrol
implements
powercontroller
@override
public
void
poweron()
@override
public
void
poweroff()
public
void
nextchannel()
public
void
prevchannel()
public
void
turnup()
public
void
turndown()
}
/**
* 客戶端呼叫
*/public
class
client
}
執行結果:
四、優缺點
優點:
狀態模式將所有與乙個特定的狀態有關的的行為都放入乙個狀態物件中,它提供了乙個更好的方法來組織與特定狀態相關的**,將繁瑣的狀態判斷轉換成結構清晰的狀態類族,在避免**膨脹的同時也保證了可擴充套件性與可維護性。
缺點:
狀態模式的使用必然會增加系統類和物件的個數。
活動當下,隨遇而安
錢多錢少,知足就好。人醜人美,順眼就好。人老人少,健康就好。家窮家富,和氣就好。老公晚歸,回來就好。老婆嘮叨,顧家就好。孩子從小,就要管好。博士也好,賣菜也好,長大以後,平安就好。房屋大小,能住就好。名不名牌,能穿就好。兩輪四輪,能駕就好。老闆不好,能忍就好。一切煩惱,能解就好,堅持執著,放下最好。...
設計模式 07 介面卡模式與外觀模式(隨遇而安)
物件介面卡 類介面卡 物件和類介面卡的區別 外觀模式 外觀模式示例 模式測試 外觀模式 定義 將乙個類的介面,轉換成客戶期望的另乙個介面。介面卡讓原本介面不相容的類可以合作無間 優勢可以將改變的部分封裝起來,客戶就不必為了應對不同的介面而每次跟著修改。符合oo設計原則 使用物件組合,以修改的介面包裝...
靜倚塵世,隨遇而安
生命,是一場眷戀著一程程山水的旅途。紅塵流年,折煞多少情思?喜歡鉛華洗盡,喜歡紅塵初妝,喜歡與你,盈著一眸柔情,薄施粉黛,靜倚塵世。或許,當我們真正老去,白髮,情思,終是一曲當年未曾脫口的殤。記 花開無言,歲月靜好。欣然與這樣的生活,江南屋簷下,看你舞一闕水墨情長,共一簾憂思如畫。打馬而過的翩翩清歡...