论坛首页 Java企业应用论坛

state(状态)模式的应用

浏览 12997 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2008-11-16   最后修改:2008-11-16
先简单介绍一下状态模式:将与状态有关处理逻辑分散到代表对象状态各个类中!
状态之间的改变都对应一个动作,一个动作可能对应多个状态的改变(动作来描述。可能不是特别准确),如提交,审核....

state模式的两个原则:
1.有几个动作就有几个方法,一个动作可能对应多个状态转换,这些方法都定义在同一个接口里。
2.有几个状态就有几个实现上述接口的类。

用户升级vip例子:首先用户必须是注册用户,普通用户升级vip需要提交真实的个人信息,工作人员根据提交信息的真实性进行审核。审核通过成为vip用户,审核未通过,可以再次申请。升级到vip以后,如果查到有违反纪律的。降级到普通用户。需要重新提交vip申请。

[img]/upload/attachment/50463/5d802be4-ebcf-3bc8-8e1e-4f6c4b163c13.jpg" alt="[/img]
先定义接口UserState
 
 public interface UserState {
	public UserService userService = new UserService();
	// 状态为0代表普通用户,这些状态主要用于持久化到数据
	public final static int COMMON_STATUS = 0;
	// 状态为1代表待审核用户
	public final static int FOR_VERIFY_STATUS = 1;
	// 状态为2是代表vip用户
	public final static int VIP_STATUS = 2;

	// 提交信息
	public void submit() throws Exception;

	// 审核没通过
	public void rollback() throws Exception;

	// 审核通过
	public void pass() throws Exception;

	public int getStatus();
}


代表各个状态的类
未提交信息的用户NotSubmitUser.java
 
public class NotSubmitUser implements UserState {
	public void pass() throws Exception {
		throw new Exception("no support method");
	}

	public void rollback() throws Exception {
		throw new Exception("no support method");
	}

	public void submit() throws Exception {
		User user = userService.getUser(0);
		user.setStauts(FOR_VERIFY_STATUS);
		userService.update(user);
	}

	public int getStatus() {
		return COMMON_STATUS;
	}
}


待审核的用户WaitForVerifyUser.java
 
public class WaitForVerifyUser implements UserState {

	public void pass() throws Exception {
		User user = userService.getUser(0);
		user.setStauts(VIP_STATUS);
		userService.update(user);
	}

	public void rollback() throws Exception {
		User user = userService.getUser(0);
		user.setStauts(COMMON_STATUS);
		userService.update(user);
	}

	public void submit() throws Exception {
		throw new Exception("no support method");
	}

	public int getStatus() {
		return VIP_STATUS;
	}
}

审核通过的用户,vip VipUser.java
 
public class VipUser implements UserState {

	public void pass() throws Exception {
		throw new Exception("no support method");
	}

	public void rollback() throws Exception {
		User user = userService.getUser(0);
		user.setStauts(COMMON_STATUS);
		userService.update(user);
	}

	public void submit() throws Exception {
		throw new Exception("no support method");
	}

	public int getStatus() {
		return FOR_VERIFY_STATUS;
	}
}


根据用户的status的返回不同的UserState
 
public class UserStateFactory {
	static List list = null;
	static {
		list = new ArrayList();
		list.add(new NotSubmitUser());
		list.add(new VipUser());
		list.add(new WaitForVerifyUser());

	}

	public static UserState getUserState(int status) {
		for (UserState state : list) {
			if (state.getStatus() == status)
				return state;
		}
		return null;
	}
}


[size=small;]状态模式操作是固定的,但是接受者类不相同。多态性的原则实际执行哪个方法不仅取决与方法签名,还取决与操作的接受者类。

该例子只是state模式的一个场景的应用,比较具体。
状态模式的优点:1.非常好的扩展性---假设增加一个用户组:当vip用户的信用达到一定程度后,升级到永久的vip。这时只需另外添加一个状态类,对原来的代码并不需要做改动。
2.代码结构清晰,不同出错。即程序健壮--除UserStateFactory的getUserState(int status)外,其他方法的逻辑非常的简单,都不包含局部变量。如果程序不需要持久化到数据库,也不需要getUserState(int status),该方法是状态模式内容之外的

用状态模式类的数量会大大的增加。

说明:该例子只是状态模式的一个应用,并不是状态模式,是属于比较具体。[/size]

  • 大小: 13.8 KB
   发表时间:2008-11-17  
怎么都没人一起探讨一下的!
哎~~~~
0 请登录后投票
   发表时间:2008-11-17  
楼主列出的两个优点似乎跟状态模式没有什么关系
第一个说的是继承普遍的优点
第二个说的是工厂模式的优点
状态模式的优点在于封装状态转换动作和规则,状态和动作是对应的,下一个状态也是明确的
0 请登录后投票
   发表时间:2008-11-18  
Java大拿,说说设计模式啊  学习中....
0 请登录后投票
   发表时间:2008-11-18  
duooluu 写道
楼主列出的两个优点似乎跟状态模式没有什么关系
第一个说的是继承普遍的优点
第二个说的是工厂模式的优点
状态模式的优点在于封装状态转换动作和规则,状态和动作是对应的,下一个状态也是明确的


1.如果不用状态模式,每加一个状态都要在方法里加个if else。
2.本来应该执行一个动作转换后,应该返回下一个状态的对象。但是对象只能在内存中,
无能持久化到数据库。
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics