【設計模式】(二十九)–行爲型模式–狀態模式
狀態模式定義
Allow an object to alter its behavior when its internal state changes. The object will appear to change its class.
意思是:當一個對象內在狀態改變時允許改變行爲,這個對象看起來像改變了其類型。
對象的行爲依賴於它的狀態(屬性),並且可以根據它的狀態改變而改變它的相關行爲。
狀態模式基於以下三個元素:
- State 抽象狀態類,封裝了一個狀態和狀態對應的行爲接口。
- Concrete State 具體狀態類,實現了行爲接口。
- Context 環境類,定義了外部需要的接口,持有一個狀態對象,並且負責切換具體的狀態以及行爲調用。
狀態模式的優點
- 1、封裝了轉換規則。
- 2、枚舉可能的狀態,在枚舉狀態之前需要確定狀態種類。
- 3、將所有與某個狀態有關的行爲放到一個類中,並且可以方便地增加新的狀態,只需要改變對象狀態即可改變對象的行爲。
- 4、允許狀態轉換邏輯與狀態對象合成一體,而不是某一個巨大的條件語句塊。 5、可以讓多個環境對象共享一個狀態對象,從而減少系統中對象的個數。
但是使用狀態模式會產生很多子類,不易管理。
狀態模式的使用場景
- 1、行爲隨狀態改變而改變的場景。
- 2、條件、分支語句的代替者。
狀態模式的簡單實現
類圖
實現
public class Test {
public static void main(String[] args) {
TV tv = new TV();
tv.start();
tv.changeDFTV();
tv.changeZJTV();
tv.changeHNTV();
}
}
/**
* 電視
*/
public class TV {
private final static Channel ZJTV = new ZJTV();
private final static Channel DFTV = new DFTV();
private final static Channel HNTV = new HNTV();
private Channel channel;
public void setChannel(Channel channel) {
this.channel = channel;
}
public void changeZJTV() {
System.out.println("切換節目");
this.setChannel(ZJTV);
this.channel.display();
}
public void changeDFTV() {
System.out.println("切換節目");
this.setChannel(DFTV);
this.channel.display();
}
public void changeHNTV() {
System.out.println("切換節目");
this.setChannel(HNTV);
this.channel.display();
}
public void start() {
System.out.println("開機,初始節目");
Channel initChannel = HNTV;
this.setChannel(initChannel);
this.channel.display();
}
}
/**
* 頻道
*/
public interface Channel {
/**
* 展示節目
*/
void display();
}
/**
* 湖南衛視
*/
public class HNTV implements Channel {
@Override
public void display() {
System.out.println("湖南衛視:我是歌手!");
}
}
/**
* 浙江衛視
*/
public class ZJTV implements Channel {
@Override
public void display() {
System.out.println("浙江衛視:奔跑吧!兄弟!");
}
}
/**
* 東方衛視
*/
public class DFTV implements Channel {
@Override
public void display() {
System.out.println("東方衛視:極限挑戰");
}
}
結果