Java中除去有設計原則之外,還有23中設計模式。
這些模式都是前輩們一點一點積累下來,一直在改進,一直在優化的,而這些設計模式可以解決一些特定的問題。
并且在這些模式中,可以說是将語言的使用展現的淋漓盡緻。
那我們今天要學習 行為型模式 中的 狀态模式 !
狀态模式
我們先來看看什麼叫做狀态模式
我們可以通過百科了解到,狀态模式是可以讓一個對象内部狀态改變,然後改變它的行為,這樣對象看起來修改了它的類,可能說起來比較抽象,我們舉一個例子
就用天氣來說,天氣可以有晴天、有下雨天、刮風天等等,不同的天氣就會有不同的行為,好比說晴天,它不可能出現狂風驟雨,而是應該萬裡無雲,陽光普照
狀态模式的定義與特點
狀态(State)模式的定義:對有狀态的對象,把複雜的“判斷邏輯”提取到不同的狀态對象中,允許狀态對象在其内部狀态發生改變時改變其行為。
狀态模式是一種對象行為型模式,其主要優點如下。
1. 狀态模式将與特定狀态相關的行為局部化到一個狀态中,并且将不同狀态的行為分割開來,滿足“單一職責原則”。
2. 減少對象間的互相依賴。将不同的狀态引入獨立的對象中會使得狀态轉換變得更加明确,且減少對象間的互相依賴。
3. 有利于程式的擴充。通過定義新的子類很容易地增加新的狀态和轉換。
狀态模式的主要缺點如下。
1. 狀态模式的使用必然會增加系統的類與對象的個數。
2. 狀态模式的結構與實作都較為複雜,如果使用不當會導緻程式結構和代碼的混亂。
狀态模式的結構與實作
狀态模式把受環境改變的對象行為包裝在不同的狀态對象裡,其意圖是讓一個對象在其内部狀态改變的時候,其行為也随之改變。
狀态模式包含以下主要角色:
1. 環境角色:也稱為上下文,它定義了客戶感興趣的接口,維護一個目前狀态,并将與狀态相關的操作委托給目前狀态對象來處理。
2. 抽象狀态角色:定義一個接口,用以封裝環境對象中的特定狀态所對應的行為。
3. 具體狀态角色:實作抽象狀态所對應的行為。
知道這些之後,我們來實作一下上面的例子
第一步:
我們先來定義一下抽象狀态類,這個類就是天氣
我們定義好之後,添加好這個天氣的方法
第二步:
接着我們來定義一下我們的具體實作抽象狀态類
第三步:
接着我們需要一個環境角色,我們可以通過改變狀态來進行檢視目前天氣
package com.java.state;
public class Context {
private Weather weather;
private Integer status;
public Context(Integer status) {
this.status = status;
if(this.status == 1) {
this.weather = new SunnyDay();
}
if(this.status == 2) {
this.weather = new WindDay();
}
if(this.status == 3) {
this.weather = new SnowDay();
}
}
public Weather getWeather() {
return weather;
}
public void setWeather(Weather weather) {
this.weather = weather;
}
public Integer getStatus() {
return status;
}
public void setStatus(Integer status) {
this.status = status;
if(this.status == 1) {
this.weather = new SunnyDay();
}
if(this.status == 2) {
this.weather = new WindDay();
}
if(this.status == 3) {
this.weather = new SnowDay();
}
}
public void weather() {
this.weather.weather();
}
}
我們在執行個體化環境的時候,可以傳遞一個 Integer 類型的變量,并且讓這個變量綁定本類中的 status ,這樣通過修改 status ,根據變量去建立對應的類型,并調用具體的實作
測試:
我們來弄一個 Test 類,進行測試
我們來看一下
然後我們修改一下status
是不是,OK的啊,大家感受一下
OK,就到這裡,大家好好看一下。多多練習。有問題可以聯系我QQ:2100363119
歡迎大家通路我的個人網站:lemon1234.com 感謝大家留言