浏览 13028 次
锁定老帖子 主题:state(状态)模式的应用
精华帖 (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] 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2008-11-17
怎么都没人一起探讨一下的!
哎~~~~ |
|
返回顶楼 | |
发表时间:2008-11-17
楼主列出的两个优点似乎跟状态模式没有什么关系
第一个说的是继承普遍的优点 第二个说的是工厂模式的优点 状态模式的优点在于封装状态转换动作和规则,状态和动作是对应的,下一个状态也是明确的 |
|
返回顶楼 | |
发表时间:2008-11-18
Java大拿,说说设计模式啊 学习中....
|
|
返回顶楼 | |
发表时间:2008-11-18
duooluu 写道 楼主列出的两个优点似乎跟状态模式没有什么关系
第一个说的是继承普遍的优点 第二个说的是工厂模式的优点 状态模式的优点在于封装状态转换动作和规则,状态和动作是对应的,下一个状态也是明确的 1.如果不用状态模式,每加一个状态都要在方法里加个if else。 2.本来应该执行一个动作转换后,应该返回下一个状态的对象。但是对象只能在内存中, 无能持久化到数据库。 |
|
返回顶楼 | |