码迷,mamicode.com
首页 > 移动开发 > 详细

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

时间:2015-06-18 17:18:33      阅读:123      评论:0      收藏:0      [点我收藏+]

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

以后有时间补上。



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

标签:设计模式   android   

原文地址:http://blog.csdn.net/naibbian/article/details/46549321

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!