Android设计模式(十三)--状态模式

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模式,因为自己没有具体研究,就不写了。

以后有时间补上。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值