个人博客
状态模式
模式介绍
状态模式中的行为是由状态来决定的,不同状态下有不同的行为。
模式定义
当一个对象的内在状态改变时允许其改变行为。
使用场景
-
一个对象的行为取决于它的状态,并且它必须在运行时根据状态来改变行为。
-
代码中包含大量与对象状态有关的条件语句。
简单使用
定义状态接口
public interface TvState {
public void nextChannel();
public void prevChannel();
public void turnUp();
public 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 {
public void powerOn();
public void powerOff();
}
定义控制类的实现类
public class TvController implements PowerController {
private TvState mTvState;
private void setTvState(TvState tvState) {
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 static void main(String[] args) {
TvController tvController = new TvController();
tvController.powerOn();
tvController.nextChannel();
tvController.turnUp();
tvController.powerOff();
tvController.turnDown();
}
输出结果
开机啦
下一个频道
增加音量
关机啦