随遇而安–状态模式
定义 当一个对象的内在状态改变时允许改变其行为,这个对象看起来是改变了其类。
使用场景
(1)一个对象的行为取决于它的状态,并且他必须在运行时根据状态改变它的行为。
(2)代码中包含大量与对象状态有关的条件语句,例如,一个操作中含有庞大的多分支语句
(if-else或switch-case)且这些分支依赖于该对象的状态。
状态模式将每一个条件分支放入一个独立的类中,这使得你可以根据对象自身的情况将对象的状态作为一个对象
,这一对象可以不依赖于其他对象而独立变化,这样通过多态来去除过多的、重复的if-else等分支语句。
看一看状态模式的实际应用简例
下面我们就以电脑为例演示一下状态模式。
电脑状态有开机和关机,在开机状态下我们可以看文档,看电影,听音乐,玩游戏,写代码,但是此时在按开机是无效的
而在关机状态下这些都是无效的操作,只有按开机按钮时会生效。
//电脑状态接口,定义电脑的操作
public interface PCState {
void word();
void film();
void music();
void game();
void code();
}
//关机状态此时只有开机能做
public class PowerOffState implements PCState{
@Override
public void word() {
}
@Override
public void film() {
}
@Override
public void music() {
}
@Override
public void game() {
}
@Override
public void code() {
}
}
//开机状态 可以进行一切操作
public class PowerOnState implements PCState {
@Override
public void word() {
System.out.println("看文档");
}
@Override
public void film() {
System.out.println("看电影");
}
@Override
public void music() {
System.out.println("听音乐");
}
@Override
public void game() {
System.out.println("玩游戏");
}
@Override
public void code() {
System.out.println("写代码");
}
}
// 电源操作
public interface PowerController {
void start();
void end();
}
public class PCController implements PowerController{
PCState pcState;
public PCState getPcState() {
return pcState;
}
public void setPcState(PCState pcState) {
this.pcState = pcState;
}
@Override
public void start() {
System.out.println("开机啦");
setPcState(new PowerOnState());
}
@Override
public void end() {
System.out.println("关机啦");
setPcState(new PowerOffState());
}
}
//客户端调用Z
public class PCClient {
public static void main(String[] args){
PCController pcController = new PCController();
pcController.start();
pcController.getPcState().word();
pcController.getPcState().film();
pcController.getPcState().music();
pcController.getPcState().game();
pcController.getPcState().code();
pcController.end();
//关机了 无用
pcController.getPcState().word();
pcController.getPcState().film();
pcController.getPcState().music();
pcController.getPcState().game();
pcController.getPcState().code();
}
}
贴一下结果
看文档
看电影
听音乐
玩游戏
写代码
关机啦
Process finished with exit code 0