状态模式

引入:http://www.iteye.com/topic/267870
先简单介绍一下状态模式:将与状态有关处理逻辑分散到代表对象状态各个类中!
状态之间的改变都对应一个动作,一个动作可能对应多个状态的改变(动作来描述。可能不是特别准确),如提交,审核....

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),该方法是状态模式内容之外的

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

说明:该例子只是状态模式的一个应用,并不是状态模式,是属于比较具体。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值