設計模式之十 狀態模式

2021-08-28 02:10:58 字數 2811 閱讀 9851

目錄

狀態模式 目錄

定義 例子

設計原則 總結

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

我們使用《head first 設計模式》中的糖果機例子:

糖果機有noquarter、hasquarter、sold、soldout等狀態,當然,我們後期可以根據需求加入winner狀態。

首先,讓我們建立乙個介面,讓所有的狀態都必須實現這個介面:

/**

* 狀態類

* @author kwin

* */

public inte***ce state

我們實現下面四個狀態,後面新增乙個贏家狀態:

/**

* 未投硬幣狀態

* @author kwin

* */

public class noquarterstate implements state

@override

public void insertquarter()

@override

public void ejectquarter()

@override

public void turncrank()

@override

public void dispense()

}

/**

* 已投硬幣狀態

* @author kwin

* */

public class hasquarterstate implements state

@override

public void insertquarter()

@override

public void ejectquarter()

@override

public void turncrank() else

} @override

public void dispense()

}

/**

* 售光狀態

* @author kwin

* */

public class soldoutstate implements state

@override

public void insertquarter()

@override

public void ejectquarter()

@override

public void turncrank()

@override

public void dispense()

}

/**

* 銷售狀態

* @author kwin

* */

public class soldstate implements state

@override

public void insertquarter()

@override

public void ejectquarter()

@override

public void turncrank()

@override

public void dispense() else

}}

/**

* 贏家狀態

* @author kwin

* */

public class winnerstate implements state

@override

public void insertquarter()

@override

public void ejectquarter()

@override

public void turncrank()

@override

public void dispense() else

} else

}}

讓我們測試下我們的**吧

/**

* 測試**

* @author kwin

* */

public class gumballmachinetestdriver

}

測試結果:

上面的**還有很多改進的地方,比如:可以把state介面改寫成抽象類,把每個方法的預設行為放在其中,並把context上下文的注入放進其中。

despense()方法一直被呼叫,我們可以讓turncrank()返回乙個布林值作為對despense()呼叫的判斷條件。

封裝變化

多用組合,少用繼承

針對介面程式設計,不針對實現程式設計

為互動物件之間的松耦合設計而努力

類應該對擴充套件開放,對修改關閉

依賴抽象,不要依賴具體類

只和朋友交談

別找我,我會找你

類應該只有乙個改變的理由

狀態模式允許乙個物件基於內部狀態而擁有不同的行為。

通過將每乙個狀態封裝進乙個類,我們以後需要做的任何改變區域性化了。

使用狀態模式通常會導致設計中的類的數目的大量增加。

設計模式之狀態模式

一 作用 允許乙個物件在其內部狀態改變時改變它的行為,物件看起來似乎修改了它的類。其別名為狀態物件 objects for states 狀態模式是一種物件行為型模式。二 例子 狀態抽象類 abstract class state 具體狀態類,每個狀態對應乙個類 class concretestat...

設計模式之 狀態模式

gof 設計模式 中給狀態模式下的定義為 允許乙個物件在其內部狀態改變時改變它 的行為。這個物件看起來似乎修改了它的類。看起來,狀態模式好像是神通廣大 居然能夠 修改自身的類 能夠讓程式根據不同的外部情況來做出不同的響應,最直接的方法就是在程式中將這些可能發生的外部情況全部考慮到,使用 if els...

設計模式之狀態模式

定義 允許乙個物件在其內部狀態變化時改變它的行為,物件看起來似乎修改了它所屬的類。類圖 說明 context表示環境類,它定義了客戶應用程式感興趣的介面,並維護乙個concretestate子類的例項,這個例項用於定義當前狀態 state表示抽象狀態類,它定義了乙個介面以封裝與context的乙個特...