當一個狀態的內在狀態發生變化容許改變其行爲,這個對象看起來像是改變了其類(多態)設計模式
咱們都知道電視在開機狀態下能夠實現調節頻道,調節音量等操做;在關機狀態下只能開機操做,而頻道和音量調節都不能實現。下面咱們就對這種應用場景實現其具體代碼:ide
TvState /** * 電視操做基類 */ public interface TvState { //下一個頻道 void nextChannel(); //上一個頻道 void prevChannel(); //增長音量 void turnUp(); //減少音量 void turnDown(); } TvStat類中定義了操做電視的共有方法,不一樣狀態下應有其具體實現類源碼分析
PowerOffState /** * 關機狀態下的邏輯 */ public class PowerOffState implements TvState { @Override public void nextChannel() { System.out.println("PowerOffState->nextChannel"); }spa
@Override
public void prevChannel() {
System.out.println("PowerOffState->prevChannel");
}
@Override
public void turnUp() {
System.out.println("PowerOffState->turnUp");
}
@Override
public void turnDown() {
System.out.println("PowerOffState->turnDown");
}
}
複製代碼
關機狀態下的具體實現,此狀態下電視的頻道和音調節量都不能操做設計
PowerOnState /** * 開機狀態下的操做邏輯實現類 */ public class PowerOnState implements TvState {code
@Override
public void nextChannel() {
System.out.println("PowerOnState->nextChannal");
}
@Override
public void prevChannel() {
System.out.println("PowerOnState->prevChannel");
}
@Override
public void turnUp() {
System.out.println("PowerOnState->turnUp");
}
@Override
public void turnDown() {
System.out.println("PowerOnState->turnUp");
}
}
複製代碼
開機狀態下的具體實現,可以正常的對電視進行頻道和音量的調節操做cdn
PowerController /** * 電源控制接口 */ public interface PowerController {對象
//開機
void powerOn();
//關機
void powerOff();
}
複製代碼
電源控制類,TvState的具體實現類中的具體行爲就是因電源狀態發生改變而改變的。blog
TVController /** * 電視控制類,實現電源接口 * 內部保留TvState對象,實現電視具體的邏輯操做 */ public class TvController implements PowerController { //保留TvState實例對象,調用其對應狀態下的對象方法 private TvState mTvState;接口
private void setTvState(TvState state){
mTvState = state;
}
@Override
public void powerOn() {
setTvState(new PowerOnState());
System.out.println("TV->powerOn");
}
@Override
public void powerOff() {
setTvState(new PowerOffState());
System.out.println("TV->powerOff");
}
/**
*如下各類操做電視的邏輯分別是在對應電視開關機狀態下邏輯實現
*/
public void nextChannel(){
mTvState.nextChannel();
}
public void prevChannel(){
mTvState.prevChannel();
}
public void turnUp(){
mTvState.turnUp();
}
public void turnDown(){
mTvState.turnDown();
}
}
複製代碼
TVController對應於Context類,實現PowerController的方法(開機和關機),經過開關機咱們得知其具體的狀態,在這種狀態下,經過具體行爲的基類TvState實例對象,應用多態特性,其對象的具體行爲自動接受其狀態牽制,達到不一樣狀態下有不一樣的具體行爲
運行結果
TV->powerOff
PowerOffState->nextChannel
PowerOffState->turnUp
TV->powerOn
PowerOnState->prevChannel
PowerOnState->turnUp
複製代碼
上面的實例中
參考文獻:Android源碼設計模式解析與實戰