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