設計模式之狀態模式
狀態模式,顧名思義,行爲是由狀態來決定的,不同的狀態下有不同的行爲,比如說電視機,當我們按開機鍵後,頻道+,-,音量+、-都可以使用,而當我們按關機鍵之後除了開機鍵其他鍵都不可以使用。這就是一種狀態
沒圖我說個JB...
角色介紹:
Context 環境類,定義客戶感興趣的接口,維護一個State子類的示例,這個實例定義了對象的當前狀態;
State 抽象狀態類或者狀態接口,定義一個或者一組接口,表示該狀態下的行爲。
ConcreteStateA,ConcreteStateB 具體狀態類,每一個具體的狀態類實現抽象State中定義的接口,從而達到不同狀態下的不同行爲
就上面的那個例子,如果不按照狀態模式寫的話就是這樣的
package
Client;
/**
* 不按照狀態模式寫
* 電視遙控器、含有開機、關機、下一頻道、上一頻道、調高音量、調低音量、這幾個功能
* */
public
class
TvController {
//開機狀態
private
final
static
int
POWER_ON=1;
//關機狀態
private
final
static
int
POWER_OFF=2;
private
int
mState
=POWER_OFF;
public
void
powerOn(){
mState=POWER_ON
;
if(mState
==POWER_OFF){
System.
out.println("開機了!"
);
}
}
public
void
PowerOff(){
mState=POWER_OFF
;
if(mState
==POWER_ON){
System.
out.println("關機了
!" );
}
}
public
void
nextChannel(){
if(mState
==POWER_ON){
System.
out.println("已經切換下一頻道"
);
}
else{
System.
out.println("未開機"
);
}
}
public
void
prevChannel(){
if(mState
==POWER_ON){
System.
out.println("已經切換上一頻道"
);
}
else{
System.
out.println("未開機"
);
}
}
public
void
turnUp(){
if(mState
==POWER_ON){
System.
out.println("已經調高音量"
);
}
else{
System.
out.println("未開機"
);
}
}
public
void
turnDowm(){
if(mState
==POWER_ON){
System.
out.println("已經調低音量"
);
}
else{
System.
out.println("未開機"
);
}
}
}
這樣寫的話可以看到有太多的if else來進行判斷,而且修改的時候比較麻煩,利用狀態模式的話是下面這樣的
首先定義一個電視的狀態接口,定義電視的操作函數
package
State;
/**
* 電視狀態接口,定義了電視操作的函數
* */
public
interface
TvSAtate {
public
void
nextChannel();
public
void
prevChannel();
public
void
turnUp();
public
void
turnDown();
}
然後實現兩個狀態的操作,開機狀態的操作和關機狀態的操作:
package
State;
/**
* 關機狀態,此時只有開機功能是有效的
* **/
public
class
PowerOffState
implements
TvSAtate{
@Override
public
void
nextChannel() {
//
TODO
Auto-generated method stub
}
@Override
public
void
prevChannel() {
//
TODO
Auto-generated method stub
}
@Override
public
void
turnUp() {
//
TODO
Auto-generated method stub
}
@Override
public
void
turnDown() {
//
TODO
Auto-generated method stub
}
}
開機狀態
package
State;
/**
* 開機狀態
* */
public
class
PowerOnState
implements
TvSAtate{
@Override
public
void
nextChannel() {
//
TODO
Auto-generated method stub
System.
out.println("下一頻道"
);
}
@Override
public
void
prevChannel() {
//
TODO
Auto-generated method stub
System.
out.println("上一頻道"
);
}
@Override
public
void
turnUp() {
//
TODO
Auto-generated method stub
System.
out.println("調高音量"
);
}
@Override
public
void
turnDown() {
//
TODO
Auto-generated method stub
System.
out.println("調低音量"
);
}
}
定義一個電源操作接口
package
Controller;
/**
* 電源操作接口
* */
public
interface
PowerController {
public
void
powerOn();
public
void
powerOff();
}
然後是他的實現
/**
* 狀態模式下的遙控器
* **/
public
class
TvControllerToStae
implements
PowerController{
TvSAtate
mState;
public
void
setTvState(TvSAtate
sAtate){
this.mState
=sAtate
;
}
@Override
public
void
powerOn() {
//
TODO
Auto-generated method stub
setTvState(
new
PowerOnState());
System.
out.println("已經開機"
);
}
@Override
public
void
powerOff() {
//
TODO
Auto-generated method stub
setTvState(
new
PowerOffState());
System.
out.println("已經關機"
);
}
public
void
nextChannel(){
mState.nextChannel();
}
public
void
prevChannel(){
mState.prevChannel();
}
public
void
turnUp(){
mState.turnUp();
}
public
void
turnDowm(){
mState.turnDown();
}
}
然後是運行
package
Client;
public
class
Clien {
public
static
void
main(String[]
args) {
TvControllerToStae
tvControllerToStae=new
TvControllerToStae();
//開機之後的操作
tvControllerToStae.powerOn();
tvControllerToStae.prevChannel();
tvControllerToStae.turnUp();
tvControllerToStae.turnDowm();
tvControllerToStae.nextChannel();
System.
out.println("------我是一個漂亮的分割線------"
);
//關機之後的操作
tvControllerToStae.powerOff();
tvControllerToStae.prevChannel();
tvControllerToStae.turnUp();
tvControllerToStae.turnDowm();
tvControllerToStae.nextChannel();
}
}
在安卓中,狀態模式比較典型的就是WIFI的管理
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.