状态模式
引入:http://www.iteye.com/topic/267870
先简单介绍一下状态模式:将与状态有关处理逻辑分散到代表对象状态各个类中!
状态之间的改变都对应一个动作,一个动作可能对应多个状态的改变(动作来描述。可能不是特别准确),如提交,审核....
state模式的两个原则:
1.有几个动作就有几个方法,一个动作可能对应多个状态转换,这些方法都定义在同一个接口里。
2.有几个状态就有几个实现上述接口的类。
用户升级vip例子:首先用户必须是注册用户,普通用户升级vip需要提交真实的个人信息,工作人员根据提交信息的真实性进行审核。审核通过成为vip用户,审核未通过,可以再次申请。升级到vip以后,如果查到有违反纪律的。降级到普通用户。需要重新提交vip申请。
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; } } 状态模式操作是固定的,但是接受者类不相同。多态性的原则实际执行哪个方法不仅取决与方法签名,还取决与操作的接受者类。
该例子只是state模式的一个场景的应用,比较具体。
状态模式的优点:1.非常好的扩展性---假设增加一个用户组:当vip用户的信用达到一定程度后,升级到永久的vip。这时只需另外添加一个状态类,对原来的代码并不需要做改动。
2.代码结构清晰,不同出错。即程序健壮--除UserStateFactory的getUserState(int status)外,其他方法的逻辑非常的简单,都不包含局部变量。如果程序不需要持久化到数据库,也不需要getUserState(int status),该方法是状态模式内容之外的
用状态模式类的数量会大大的增加。
说明:该例子只是状态模式的一个应用,并不是状态模式,是属于比较具体。