状态模式
2016-12-01 本文已影响10人
helloKai
应用场景:做相同的操作但是在状态不同时所产生的结果并不相同。
电视状态接口,在开机和关机不同状态下的相同操作产生的结果不相同。关机状态下只能将状态改为开机状态
定义相同操作接口:
public interface TvState {
void nextChannel();
void prevChannel();
void turnUP();
void turnDown();
}
关机状态:(具体的操作在关机状态下不实现)
public class PowerOffState implements TvState {
@Override
public void nextChannel() {
//nothing
}
@Override
public void prevChannel() {
//nothing
}
@Override
public void turnUP() {
//nothing
}
@Override
public void turnDown() {
//nothing
}
}
开机状态:
public class PowerOnstate implements TvState {
@Override
public void nextChannel() {
//do something
}
@Override
public void prevChannel() {
//do something
}
@Override
public void turnUP() {
//do something
}
@Override
public void turnDown() {
//do something
}
}
定义了不同状态下的具体操作之后就需要再写一个开关机状态的接口和实现了开关机接口的类。
public interface PowerController {
public void powerOn();
public void powerOff();
}
public class TvController implements PowerController {
TvState mState;
public void setState(TvState state) {
mState = state;
}
@Override
public void powerOn() {
setState(new PowerOnstate());
//do something
}
@Override
public void powerOff() {
setState(new PowerOffState());
//do something
}
public void nextChannel() {
mState.nextChannel();
}
public void prevChannel() {
mState.prevChannel();
}
public void turnDown() {
mState.turnDown();
}
public void turnUp() {
mState.turnUP();
}
}
之后再写调用类:
public class Client {
public static void main(String[] args) {
TvController tvController = new TvController();
tvController.powerOn();
tvController.nextChannel();
tvController.turnDown();
tvController.powerOff();
//not work
tvController.nextChannel();
}
}