定义:当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类。
使用场景:
1、一个对象的行为取决于它的状态,并且它必须在运行时根据状态改变它的行为。
2、代码中包含大量与对象状态有关的条件语句,例如,一个操作中包含庞大的多分支语句,且这些分支依赖于该对象的状态。
写一个遥控器示例
/**
* 电视状态接口,定义了电视操作的函数
*/
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() {
Log.e("下一频道");
}
@Override
public void prevChannel() {
Log.e("上一频道");
}
@Override
public void turnUp() {
Log.e("调高音量");
}
@Override
public void turnDown() {
Log.e("调低音量");
}
}
/**
* 电源操作接口
*/
public interface PowerController {
public void powerOn();
public void powerOff();
}
public class TvController implements PowerController, TvState {
TvState tvState;
public void setTvState(TvState tvState) {
this.tvState = tvState;
}
@Override
public void powerOn() {
setTvState(new PowerOnState());
Log.e("开机啦");
}
@Override
public void powerOff() {
setTvState(new PowerOffState());
Log.e("关机啦");
}
@Override
public void nextChannel() {
tvState.nextChannel();
}
@Override
public void prevChannel() {
tvState.prevChannel();
}
@Override
public void turnUp() {
tvState.turnUp();
}
@Override
public void turnDown() {
tvState.turnDown();
}
}
public class Client {
public static void main(String[] args){
TvController tvController=new TvController();
//设置开机
tvController.powerOn();
//下一频道
tvController.nextChannel();
//调高音量
tvController.turnUp();
//设置关机
tvController.powerOff();
//调高音量,此时不会生效
tvController.turnUp();
}
}
网友评论