状态模式定义
状态模式将不同的对象行为封装到不同状态对象中,通过选择不同状态对象来控制其行为。
说得再通俗一点就是通过一个管理类来选择不同实现,各个实现的方法不同。
状态模式角色
(1)环境角色(Context)
保留一个目前具体的状态类的对象。这个对象就是目前环境的状态。
(2)抽象状态角色(State)
定义一个接口,用以封装环境(Context)对象的一个特定的状态所对应的行为。
(3)每个具体状态都实现了一个具体的状态行为。
状态模式 UML图
源码
public class CouponManager {
public void getCoupon(Integer userId) {
CouponStatus couponStatus;
//使用Map判断并记录用户请求次数
Map<Integer, Integer> userRequestTimesMap = new HashMap<Integer, Integer>();
Integer requestTimes = userRequestTimesMap.get(userId);
if (requestTimes == 1) {
couponStatus = new NormalGetCoupon();
} else if (requestTimes > 3 && requestTimes < 8) {
couponStatus = new RepeatGetCoupon();
} else if (requestTimes >= 8) {
couponStatus = new BanGetCoupon();
} else {
//打个错误日志
return;
}
couponStatus.getCoupon(userId);
}
}
public interface CouponStatus {
/**
* 获取代金券
*/
public void getCoupon(int userId);
}
public class NormalGetCoupon implements CouponStatus{
public void getCoupon(int userId) {
System.out.println("获取代金券成功!");
}
}
public class RepeatGetCoupon implements CouponStatus {
public void getCoupon(int userId) {
System.out.println("请不要重复获取代金券!");
}
}
public class BanGetCoupon implements CouponStatus {
public void getCoupon(int userId) {
System.out.println("该用户已经被禁止获取代金券");
}
}
状态模式优点