本文将介紹狀态設計模式 。 它是行為設計模式之一 。 您無需了解許多理論即可了解模式的主要概念。 該文章将分為幾個部分,在其中我将提供有關需要應用該模式的情況,它所具有的利弊以及用法示例的資訊。
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiIn5GcsQXYtJ3bm9CXldWYtlWPzNXZj9mcw1ycz9WL49zYtJ2d1MUTxUERldXVU1EdN5mY5Z1RkBjRHNGd0IjWw5EWatWMTllMG1WY2lFRNZXTU10dJpHT6J1VZZHeHNWM5MEZ1Z1RkVXOykFdBNDZ2BjMipWN5NmcWdlWuZ1RaZnTXllMG1WY1N2MkNTO5xkNNh0YwIFSh9CXuNmLn1WauR2cj5CdyVmdu92Yn1Wavw1LcpDc0RHaiojIsJye.jpg)
有時,當對象的内部狀态更改時,您需要更改其行為。 State設計模式允許執行此操作。 您可以通過建立代表不同狀态和功能的單獨類來獲得此功能。 當然,這些類必須從一個抽象類繼承或實作一個接口。
當我們需要在運作時通過輸入某些State基類的不同子類來更改對象的狀态時,可以使用State設計模式。 這種情況同時是有利和不利的,因為我們有明确的,獨立的州類别,并具有一定的邏輯,而另一方面,類别的數量卻在增加。
讓我們考慮這個例子。 每年有四個季節:冬季,Spring,夏季和秋季。每個季節都有其自己的順序,例如,Spring在冬季之後,夏季在Spring之後等等。
季節的基本狀态界面:
public interface Season {
public void theSeason(SeasonContext context);
}
實作Season接口的狀态類:
public class Winter implements Season {
@Override
public void theSeason(SeasonContext context) {
System.out.println("Winter is now.");
context.setSeason(new Spring());
}
}
Spring班:
public class Spring implements Season {
@Override
public void theSeason(SeasonContext context) {
System.out.println("Spring is now");
context.setSeason(new Summer());
}
}
我将省略夏季和秋季的課程,因為它們與以前的課程相同。
SeasonContext類:
public class SeasonContext {
private Season season;
public SeasonContext() {
this.season = new Winter();
}
public void setSeason(Season season) {
this.season = season;
}
public void whatTheSaeson() {
season.theSeason(this);
}
}
所有這些内容都顯示了狀态模式的體系結構:基本狀态接口,實作狀态接口和狀态上下文的類。 現在讓我們看看它是如何工作的:
...
public static void main(String[] args) {
SeasonContext sc = new SeasonContext();
sc.whatTheSaeson();
sc.whatTheSaeson();
sc.whatTheSaeson();
sc.whatTheSaeson();
}
...
結果将是:
Winter is now.
Spting is now
Summer is now.
Autumn is now.
參考: 設計模式:在Fruzenshtein的注釋部落格中,來自我們JCG合作夥伴 Alexey Zvolinskiy的陳述 。
翻譯自: https://www.javacodegeeks.com/2013/07/design-patterns-state.html