天天看點

Java23種設計模式——17.行為型模式之狀态模式狀态模式狀态模式的定義與特點狀态模式的結構與實作

Java中除去有設計原則之外,還有23中設計模式。

這些模式都是前輩們一點一點積累下來,一直在改進,一直在優化的,而這些設計模式可以解決一些特定的問題。

并且在這些模式中,可以說是将語言的使用展現的淋漓盡緻。

那我們今天要學習  行為型模式  中的  狀态模式  !

狀态模式

我們先來看看什麼叫做狀态模式

Java23種設計模式——17.行為型模式之狀态模式狀态模式狀态模式的定義與特點狀态模式的結構與實作

我們可以通過百科了解到,狀态模式是可以讓一個對象内部狀态改變,然後改變它的行為,這樣對象看起來修改了它的類,可能說起來比較抽象,我們舉一個例子

就用天氣來說,天氣可以有晴天、有下雨天、刮風天等等,不同的天氣就會有不同的行為,好比說晴天,它不可能出現狂風驟雨,而是應該萬裡無雲,陽光普照

狀态模式的定義與特點

狀态(State)模式的定義:對有狀态的對象,把複雜的“判斷邏輯”提取到不同的狀态對象中,允許狀态對象在其内部狀态發生改變時改變其行為。

狀态模式是一種對象行為型模式,其主要優點如下。

1. 狀态模式将與特定狀态相關的行為局部化到一個狀态中,并且将不同狀态的行為分割開來,滿足“單一職責原則”。

2. 減少對象間的互相依賴。将不同的狀态引入獨立的對象中會使得狀态轉換變得更加明确,且減少對象間的互相依賴。

3. 有利于程式的擴充。通過定義新的子類很容易地增加新的狀态和轉換。

狀态模式的主要缺點如下。

1. 狀态模式的使用必然會增加系統的類與對象的個數。

2. 狀态模式的結構與實作都較為複雜,如果使用不當會導緻程式結構和代碼的混亂。

狀态模式的結構與實作

狀态模式把受環境改變的對象行為包裝在不同的狀态對象裡,其意圖是讓一個對象在其内部狀态改變的時候,其行為也随之改變。

狀态模式包含以下主要角色:

1. 環境角色:也稱為上下文,它定義了客戶感興趣的接口,維護一個目前狀态,并将與狀态相關的操作委托給目前狀态對象來處理。

2. 抽象狀态角色:定義一個接口,用以封裝環境對象中的特定狀态所對應的行為。

3. 具體狀态角色:實作抽象狀态所對應的行為。

知道這些之後,我們來實作一下上面的例子

第一步:

我們先來定義一下抽象狀态類,這個類就是天氣

Java23種設計模式——17.行為型模式之狀态模式狀态模式狀态模式的定義與特點狀态模式的結構與實作

我們定義好之後,添加好這個天氣的方法

第二步:

接着我們來定義一下我們的具體實作抽象狀态類

Java23種設計模式——17.行為型模式之狀态模式狀态模式狀态模式的定義與特點狀态模式的結構與實作
Java23種設計模式——17.行為型模式之狀态模式狀态模式狀态模式的定義與特點狀态模式的結構與實作
Java23種設計模式——17.行為型模式之狀态模式狀态模式狀态模式的定義與特點狀态模式的結構與實作

第三步:

接着我們需要一個環境角色,我們可以通過改變狀态來進行檢視目前天氣

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 類,進行測試

Java23種設計模式——17.行為型模式之狀态模式狀态模式狀态模式的定義與特點狀态模式的結構與實作

我們來看一下

Java23種設計模式——17.行為型模式之狀态模式狀态模式狀态模式的定義與特點狀态模式的結構與實作

然後我們修改一下status

Java23種設計模式——17.行為型模式之狀态模式狀态模式狀态模式的定義與特點狀态模式的結構與實作

是不是,OK的啊,大家感受一下

OK,就到這裡,大家好好看一下。多多練習。有問題可以聯系我QQ:2100363119

歡迎大家通路我的個人網站:lemon1234.com 感謝大家留言

繼續閱讀