状态模式:当一个对象 的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类。
简单点说:一个对象的功能根据它内部状态而表现出不同的行为。
举一个反例,用遥控器来举例,遥控器在电视开的情况下和电视没开的情况下,同样的按键会表现出不同的结果。
普通的编程方式:
public class TeleController {
/**
* 开机状态
*/
public static int STATE_ON = 1;
/**
* 关机状态
*/
public static int STATE_OFF = 2;
/**
* 当前状态
*/
private int currentState;
/**
* 按电源键
*/
public void powerOn(){
if(currentState == STATE_ON){
currentState = STATE_OFF;
System.out.println("电视关啦..");
}else{
currentState = STATE_ON;
System.out.println("电视开啦..");
}
}
public void powerOff(){
if(currentState == STATE_ON){
currentState = STATE_OFF;
System.out.println("电视关了..");
}
}
/**
* 下一个频道
*/
public void next(){
if(currentState == STATE_ON){
System.out.println("切换到下一个频道了..");
}
}
/**
* 上一个频道
*/
public void pre(){
if(currentState == STATE_ON){
System.out.println("切换到上一个频道...");
}
}
/**
* 调大音量
*/
public void turnOn(){
if(currentState == STATE_ON){
System.out.println("调大音量...");
}
}
public void turnOff(){
if(currentState == STATE_ON){
System.out.println("调小音量..");
}
}
}
看着也不错,但是代码明显已经有重复的了,比如判断状态,有人可能会说,把判断状态提成一个方法吧,这样代码既复用,又好看,但是这不能从根本上解决问题,因为根本上还是要去做判断,而这只是两种状态,如果以后加入10种状态,10个功能方法呢????你的if,else判断怎么办?╮(╯▽╰)╭根本是判断不完的好不好。。
这个时候我就需要用状态模式来解决这个问题了,因为这四个方法是根据状态的不同而表现出的不同结果,所以其实我们只需要改变状态就行,而不需要去改变这四个方法,那到底怎么做,看着。
定义顶层接口,抽象与状态相关的方法:
/**
* 与状态相关的方法抽象
* @author PC
*
*/
public interface State {
/**
* 下一个频道
*/
public void next();
/**
* 上一个频道
*/
public void pre();
/**
* 调大音量
*/
public void turnOn();
/**
* 调小音量
*/
public void turnOff();
}
实现类:
开机状态:
/**
* 开机状态
* @author PC
*
*/
public class PowerOnState implements State {
public void next() {
System.out.println("切换到下一频道..");
}
public void pre() {
System.out.println("切换到上一频道..");
}
public void turnOn() {
System.out.println("调大声音..");
}
public void turnOff() {
System.out.println("调小声音..");
}
}
关机状态:
/**
* 关机状态
* @author PC
*
*/
public class PowerOffState implements State {
public void next() {
}
public void pre() {
}
public void turnOn() {
}
public void turnOff() {
}
}
遥控器类:
public class TeleController {
/**
* 状态
*/
private State state;
/**
* 开机状态
*/
private State stateOn = new PowerOnState();
/**
* 关机装填
*/
private State stateOff = new PowerOffState();
public void setState(State state){
this.state = state;
}
/**
* 按电源键
*/
public void powerOn(){
setState(stateOn);
System.out.println("电视开了..");
}
public void powerOff(){
setState(stateOff);
System.out.println("电视关了..");
}
/**
* 下一个频道
*/
public void next(){
state.next();
}
/**
* 上一个频道
*/
public void pre(){
state.pre();
}
/**
* 调大音量
*/
public void turnOn(){
state.turnOn();
}
/**
* 调小音量
*/
public void turnOff(){
state.turnOff();
}
}
看到没,只关心状态的切换,具体的功能让具体的状态实现类去完成,而且切换状态也不需要判断,代码清晰,扩展或者修改几乎不影响这个功能类。
在powerOn状态中四个功能都有反应,在powerOff状态中四个功能都没有反应,呵呵哈哈哈。