設計模式----狀態模式UML和實現代碼

1、什麼是狀態模式?

狀態模式(State)定義:java

當一個對象的內在狀態改變時容許改變其行爲,這個對象看起來像是改變了其類。git

狀態模式主要解決的是當控制一個對象狀態的條件表達式過於複雜時的狀況。把狀態的判斷邏輯轉移到表示不一樣狀態的一系列類中,能夠把複雜的判斷邏輯簡化。github

類型:形爲型模式 ide

順口溜:中訪策備迭 模命職解this

2、狀態模式UML

3、JAVA代碼實現

package com.amosli.dp.behavior.state;

public abstract class State {
	public abstract void handle(Context context);
}

package com.amosli.dp.behavior.state;


public class Context {
	private State state;

	public State getState() {
		return state;
	}

	public void setState(State state) {
		this.state = state;
	}

	public Context(State state) {
		this.state = state;
	}

	public void request() {
		state.handle(this);
	}
}

    package com.amosli.dp.behavior.state;

public class ConcreteState1 extends State {

	@Override
	public void handle(Context context) {
		System.out.println("this is state1");
		context.setState(new ConcreteState2());
	}

package com.amosli.dp.behavior.state;

public class ConcreteState2 extends State {


	@Override
	public void handle(Context context) {
		System.out.println("this is state2");
		context.setState(new ConcreteState3());
	}

}
}

package com.amosli.dp.behavior.state;

public class ConcreteState3 extends State {

	@Override
	public void handle(Context context) {
		System.out.println("this is state3");
		context.setState(new ConcreteState1());
	}

}

package com.amosli.dp.behavior.state;

public class Client {
	public static void main(String[] args) {
		Context context = new Context(new ConcreteState1());
		context.request();
		context.request();
		context.request();
		context.request();
	}
}

  狀態模式包含以下角色: 
       Context: 環境類。能夠包括一些內部狀態。 
       State: 抽象狀態類。State定義了一個全部具體狀態的共同接口,任何狀態都實現這個相同的接口,這樣一來,狀態之間就能夠互相轉換了。 
       ConcreteState: 具體狀態類。具體狀態類,用於處理來自Context的請求,每個ConcreteState都提供了它對本身請求的實現,因此,當Context改變狀態時行爲也會跟着改變。spa

4、使用場景

1.一個對象的行爲取決於它的狀態,而且它必須在運行時刻根據狀態改變它的行爲。

2.一個操做中含有龐大的多分支結構,而且這些分支決定於對象的狀態。

5、優缺點

一、優勢

1 ) 它將與特定狀態相關的行爲局部化,而且將不一樣狀態的行爲分割開來code

2) 它使得狀態轉換顯式化orm

3) State對象可被共享

二、缺點

1) 狀態模式的使用必然會增長系統類和對象的個數。
2) 狀態模式的結構與實現都較爲複雜,若是使用不當將致使程序結構和代碼的混亂。對象

6、源碼地址接口

本系列文章源碼地址,https://github.com/amosli/dp  歡迎Fork  & Star !!

相關文章
相關標籤/搜索