1.状态模式概况
-
适用条件
1.一个对象的行为取决于它的状态,并且在它必须在运行时根据状态改变它的行为。
2.代码中包含大量与对象状态有关的条件语句。Context包含有状态的接口的声明,利用多态的特性,可以自由的转换其接口的实现,从而改变具体的方法。
2.状态模式举例
- 电视遥控器有开机,关机,调频道,调音量这四个功能。
但是只有在开机的情况下才能调频道,调音量。
未使用状态模式之前:
public class TvController {
private final int POWER_OFF=1;
private final int POWER_ON=2;
private int state=POWER_OFF;
public void turnOn(){
if(state==POWER_OFF){
System.out.print("开机了~");
}
state=POWER_ON;
}
public void turnOff(){
if(state==POWER_ON){
System.out.println("关机了");
}
state=POWER_OFF;
}
public void changeChannel(){
if(state==POWER_ON){
System.out.println("调频道");
}else{
System.out.println("没开机");
}
}
public void changeSound(){
if(state==POWER_ON){
System.out.println("调声音");
}
else{
System.out.println("没开机");
}
}
}
- 使用状态模式
行为/状态 | 状态一 | 状态二 |
---|---|---|
行为一 | 状态一的行为一 | 状态二的行为一 |
行为二 | 状态一的行为二 | 状态二的行为二 |
- 申明状态接口,一共有两个方法,调频道和调音量。
interface State{
public void changeChannel();
public void changeSound();
}
- 根据具体的实现方法接口
public class statePowerOn implements State{
@Override
public void changeChannel() {
System.out.println("调频道");
}
@Override
public void changeSound() {
System.out.println("调声音");
}
}
public class statePowerOff implements State{
@Override
public void changeChannel() {
}
@Override
public void changeSound() {
}
}
- 申明状态接口
interface Power{
public void PowerOn();
public void PowerOff();
}
- 创建主要使用类Context
public class TVController implements Power,State{
private State state;
@Override
public void PowerOn() {
state=new statePowerOn();
}
@Override
public void PowerOff() {
state=new statePowerOff();
}
@Override
public void changeChannel() {
state.changeChannel();
}
@Override
public void changeSound() {
state.changeSound();
}
}
- 使用
TVController tc=new TVController();
tc.PowerOn();
tc.changeChannel();
tc.changeSound();
tc.PowerOff();
tc.changeSound();