当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是其改变了类。
//电视状态接口,定义了电视操作的函数
public interface TvState{
public void nextChannel();
public void prevChannel();
public void turnUp();
public void turnDown();
}
//关机状态,此时只有开机功能是有效的
public class PowerOffState implements TvState{
@Override
public void nextChannel(){}
@Override
public void prevChannel(){}
@Override
public void turnUp(){}
@Override
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 interface PowerController{
void powerOn();
void powerOffer();
}
//电视遥控器,类似于经典状态中的Context
public class TvController implements PowerController{
TvState mTvState;
public void setTvState(TvState mTvState){
this.mTvState = mTvState;
}
@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 mian(String[] args){
TvController tvController = new TvController();
//设置开机状态
tvController.powerOn();
//下一频道
tvController.nextChannel();
//调高音量
tvController.turnUp();
//设置关机状态
tvController.powerOff();
//调高音量,此时不会生效
tvController.turnUp();
}
}