簡介
對象的行為依賴于它的狀態(tài)(屬性),可以根據(jù)狀態(tài)的改變而改變相關行為。
UML圖:
應用場景:
- 對象的行為取決于其狀態(tài),并且必須要在運行時刻根據(jù)狀態(tài)而改變行為
- 代碼中包含大量與對象狀態(tài)有關的條件語句
示例
上午、下午、晚上工作的狀態(tài)文章來源:http://www.zghlxwxcb.cn/news/detail-850881.html
- 上下文對象:
public class Work {
/**
* 工作狀態(tài)
*/
private State state;
/**
* 當前時間
*/
private int hour;
/**
* 工作是否完成
*/
private boolean isFinished;
public Work() {
// 初始化操作
this.state = new MorningState();
}
public void writeProgram() {
state.writeProgram(this);
}
public State getState() {
return state;
}
public void setState(State state) {
this.state = state;
}
public int getHour() {
return hour;
}
public void setHour(int hour) {
this.hour = hour;
}
public boolean isFinished() {
return isFinished;
}
public void setFinished(boolean finished) {
isFinished = finished;
}
}
- 狀態(tài)
public interface State {
void writeProgram(Work work);
}
public class MorningState implements State {
@Override
public void writeProgram(Work work) {
if (work.getHour() < 12) {
System.out.println("當前時間:" + work.getHour() + ",干勁十足!");
} else {
work.setState(new NoonState());
work.writeProgram();
}
}
}
public class NoonState implements State {
@Override
public void writeProgram(Work work) {
if (work.getHour() < 13) {
System.out.println("當前時間:" + work.getHour() + ",好餓,開始干飯!");
} else {
work.setState(new AfternoonState());
work.writeProgram();
}
}
}
public class AfternoonState implements State {
@Override
public void writeProgram(Work work) {
if (work.getHour() < 18) {
System.out.println("當前時間:" + work.getHour() + ",開始上班,有點疲憊!");
} else {
work.setState(new EveningState());
work.writeProgram();
}
}
}
public class EveningState implements State {
@Override
public void writeProgram(Work work) {
if (!work.isFinished()) {
System.out.println("當前時間:" + work.getHour() + ",又要加班");
} else {
System.out.println("當前時間:" + work.getHour() + ",下班啦!");
}
}
}
- 運行
public class Main {
public static void main(String[] args) {
Work work = new Work();
// 上午
work.setHour(9);
work.writeProgram();
// 中午
work.setHour(12);
work.writeProgram();
// 下午
work.setHour(16);
work.writeProgram();
// 晚上
work.setHour(18);
// work.setFinished(true);
work.writeProgram();
}
}
文章來源地址http://www.zghlxwxcb.cn/news/detail-850881.html
總結
- 優(yōu)點
- 只需改變對象的狀態(tài),就可改變對象的行為
- 多個環(huán)境對象共享一個狀態(tài)對象,可以減少系統(tǒng)中對象的個數(shù)
- 缺點
- 增加系統(tǒng)類和對象的個數(shù)
- 使用不當將造成程序結構和代碼的混亂
- 不符合開閉原則,新增狀態(tài)需要修改源碼
VS 策略模式
- 狀態(tài)模式重在各個狀態(tài)之間的切換從而有不同的行為,策略模式重在根據(jù)具體情況選擇策略不涉及狀態(tài)的切換
- 狀態(tài)模式不同狀態(tài)做不同的事情且不能相互替換,策略模式解決的都是同一件事
到了這里,關于大話設計模式——17.狀態(tài)模式(State Pattern)的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!