一、意图
允许一个对象在其内部状态改变时改变它的行为。对象看起来似乎修改了它的类。
二、适用性
在以下情况下可使用State模式:
- 一个对象的行为取决于它的状态,并且它必须在运行时刻根据状态改变它的行为。
- 一个操作中含有庞大的多分支的条件语句,且这些分支依赖于该对象的状态。这个状态通常用一个或多个枚举常量表示。通常,有多个操作包含这一相同的条件结构。State模式将每一条件分支放入一个独立的类中。这使得你可以根据对象自身的情况将对象的状态作为一个对象,这一对象可以不依赖于其他对象而独立变化。
三、结构
四、代码
public interface TvState {
void nextChannel();
void prevChannel();
void turnUp();
void turnDown();
}
public class PowerOnState implements TvState {
@Override
public void nextChannel() {
System.out.println("下一频道");
}
@Override
public void prevChannel() {
System.out.println("上一频道");
}
@Override
public void turnUp() {
System.out.println("调节音量");
}
@Override
public void turnDown() {
System.out.println("调低音量");
}
}
public class PowerOffState implements TvState {
@Override
public void nextChannel() {
}
@Override
public void prevChannel() {
}
@Override
public void turnUp() {
}
@Override
public void turnDown() {
}
}
public interface PowerController {
void powerOn();
void powerOff();
}
public class TvController implements PowerController{
TvState mTvState;
public void setTvState(TvState tvState){
this.mTvState = tvState;
}
@Override
public void powerOn() {
setTvState(new PowerOnState());
System.out.println("开机了");
}
@Override
public void powerOff() {
setTvState(new PowerOffState());
System.out.println("关机了");
}
public void nextChannel(){
mTvState.nextChannel();
}
public void prevChannel(){
mTvState.prevChannel();
}
public void turnUp(){
mTvState.turnUp();
}
public void turnDown(){
mTvState.turnDown();
}
}
public class Client {
public static void main(String[] args){
TvController tvController = new TvController();
// 设计开机状态
tvController.powerOn();
// 下一个频道
tvController.nextChannel();
//调高音量
tvController.turnUp();
tvController.powerOff();
// 调节音量,此时不会生效
tvController.turnUp();
}
}
输出结果:
开机了
下一频道
调节音量
关机了