1、定义:
当一个对象内在状态转变时,允许改变其行为,这个对象看起来改变了其类;
2、优点:
将与特定状态相关的行为局部化,并且将不同状态的行为分割开来;
3、目的:
消除庞大的条件分支语句;
4、使用:
当一个对象的行为取决于它的状态,并且它在运行时刻必须根据状态改变它的行为时,就可以考虑状态模式;
5、描述:
将特定状态的行为都放到一个对象中,将所有与状态相关的代码都放到一个类Status中,通过定义新的子类可以很容易的增加新的状态和转换;
6、缺点:
会增加系统类和对象的个数,增加系统的复杂性;
7、简单的demo:
彩票的追期中,有普通,包月,季度,半年,和一年等状态,下面的demo 就是描述这一状态的转变;
package com.example.demo.State;
/**
* 追期的状态
* @author qubian
* @data 2015年6月16日
* @email naibbian@163.com
*
*/
public interface FlowState {
public double flowData(int num);
public void last(FlowManager manager);
public void next(FlowManager manager);
}
package com.example.demo.State;
/**
* 普通状态
* @author qubian
* @data 2015年6月18日
* @email naibbian@163.com
*
*/
public class SimpleFlowState implements FlowState{
@Override
public double flowData(int num) {
return num*2;
}
@Override
public void last(FlowManager manager) {
manager.setState(null);
}
@Override
public void next(FlowManager manager) {
manager.setState(new MonthFlowState());
}
}
package com.example.demo.State;
/**
* 包月
* @author qubian
* @data 2015年6月18日
* @email naibbian@163.com
*
*/
public class MonthFlowState implements FlowState{
@Override
public double flowData(int num) {
return 14*num;
}
@Override
public void last(FlowManager manager) {
manager.setState(new SimpleFlowState());
}
@Override
public void next(FlowManager manager) {
manager.setState(new SeasonFlowState());
}
}
package com.example.demo.State;
/**
* 季度
* @author qubian
* @data 2015年6月18日
* @email naibbian@163.com
*
*/
public class SeasonFlowState implements FlowState{
@Override
public double flowData(int num) {
return 40*num;
}
@Override
public void last(FlowManager manager) {
manager.setState(new MonthFlowState());
}
@Override
public void next(FlowManager manager) {
manager.setState(new YearFLowState());
}
}
package com.example.demo.State;
/**
* 包年
* @author qubian
* @data 2015年6月18日
* @email naibbian@163.com
*
*/
public class YearFLowState implements FlowState{
@Override
public double flowData(int num) {
return 153*num;
}
@Override
public void last(FlowManager manager) {
manager.setState(new SeasonFlowState());
}
@Override
public void next(FlowManager manager) {
manager.setState(null);
}
}
追期管理:对所有追期的状态进行管理,
使用:
package com.example.demo.State;
/**
* 追期管理
* @author qubian
* @data 2015年6月18日
* @email naibbian@163.com
*
*/
public class FlowManager {
private FlowState state;
public FlowState getState() {
return state;
}
public void setState(FlowState state) {
this.state = state;
}
public int flowNum=1;
public void toNext()
{
state.next(this);
}
public void toLast()
{
state.last(this);
}
}
package com.example.demo.State;
import android.util.Log;
public class UseState {
public void use()
{
FlowState state= new SimpleFlowState();
FlowManager manager= new FlowManager();
manager.setState(state);
while(manager.getState()!=null)
{
Log.i("UseState", "Now:"+manager.getState().flowData(1));
manager.toNext();
}
}
}
8、在Android源码中,也有用到状态模式,关于StateMachine状态机中使用到的状态State模式,因为自己没有具体研究,就不写了。
以后有时间补上。