狀態模式(形式一)

2021-08-21 16:23:55 字數 3376 閱讀 7249

定義:允許物件在內部狀態改變時改變它的行為,物件看起來好像修改了它的類。

使用原始的方法:在糖果機裡面定義對應的狀態(屬性)以及行為(方法),然後在方法執行的時候,用if...else...判斷當前狀態,然後執行不同的邏輯**。

弊端:不易於擴充套件,當新增新的狀態以及行為時,需要在糖果機裡面新增屬性以及方法,還要修改之前方法裡的**。

talk is cheap show me the code

首先定義狀態介面,包含所有的行為

public inte***ce state
然後定義乙個抽象類,實現狀態介面,並提供糖果機的引用以及所有方法的預設實現

public abstract class abstractstate implements state 

@override

public void insertquarter()

@override

public void ejectquarter()

@override

public void turncrank()

@override

public void dispense()

}

接下來寫所有的狀態實現類

/**

* 沒有25分錢

* @author z_hh

* @time 2023年7月22日

*/public class noquarterstate extends abstractstate

@override

public void insertquarter()

@override

public void ejectquarter()

@override

public void turncrank()

@override

public void dispense()

}

/**

* 有25分錢

* @author z_hh

* @time 2023年7月22日

*/public class hasquarterstate extends abstractstate

@override

public void insertquarter()

@override

public void ejectquarter()

@override

public void turncrank()

@override

public void dispense()

}

/**

* 售出糖果

* @author z_hh

* @time 2023年7月22日

*/public class soldstate extends abstractstate

@override

public void insertquarter()

@override

public void ejectquarter()

@override

public void turncrank()

@override

public void dispense() else

}}

/**

* 糖果售罄

* @author z_hh

* @time 2023年7月22日

*/public class soldoutstate extends abstractstate

@override

public void insertquarter()

@override

public void ejectquarter()

@override

public void turncrank()

@override

public void dispense()

}

最後寫糖果機的**

public class gumballmachine 	}	

public void insertquarter()

public void ejectquarter()

public void turncrank()

void setstate(state state)

void releaseball() }

public state getstate()

public state getsoldoutstate()

public state getnoquarterstate()

public state gethasquarterstate()

public state getsoldstate()

public int getcount()

@override

public string tostring()

}

測試:

public class test 

}

結果:

gumballmachine [state=noquarterstate, count=5]

you insert a quarter

you turned...

a gumball comes rolling out the slot...

gumballmachine [state=noquarterstate, count=4]

you insert a quarter

you turned...

a gumball comes rolling out the slot...

you insert a quarter

you turned...

a gumball comes rolling out the slot...

gumballmachine [state=noquarterstate, count=2]

注意:本文案例來自《head first設計模式》。

問題1:如果新增了狀態以及行為,除了這種方案------介面增加方法,所有實現類也對應新增並且實現,新增狀態實現類,糖果機增加該類的引用,然後修改每個狀態實現類的相關**。還有其它方法嗎?

問題2:除了在糖果機類宣告所有狀態的引用,以及建構函式賦值,還有其它的方法嗎?

每日一記 設計模式 狀態模式

狀態介面 public inte ce state class concretestatea implements state override public void handle string param class concretestateb implements state overrid...

一 狀態模式與例項

public class tvcontroller state power on public void turnoff state power off public void changechannel else public void changesound else 行為 狀態 狀態一狀態二 ...

設計模式 狀態模式

狀態模式 當乙個物件的內在狀態改變時允許改變其行為,這個物件看起來像是改變了其類。狀態模式主要解決的是當控制乙個物件狀態轉換的條件表示式過於複雜時的情況,把狀態的判斷邏輯轉移到表示不同狀態的一些列類當中,可以把複雜的判斷邏輯簡化。當乙個物件的行為取決於它的狀態,並且它必須在執行時刻根據狀態改變它的行...