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模式,因为自己没有具体研究,就不写了。
以后有时间补上。
原文地址:http://blog.csdn.net/naibbian/article/details/46549321