码迷,mamicode.com
首页 > 其他好文 > 详细

设计模式——状态模式

时间:2018-03-31 20:32:28      阅读:132      评论:0      收藏:0      [点我收藏+]

标签:uml图   contex   用户   man   etc   对象   void   接口   管理类   

状态模式定义

状态模式将不同的对象行为封装到不同状态对象中,通过选择不同状态对象来控制其行为。

说得再通俗一点就是通过一个管理类来选择不同实现,各个实现的方法不同。


  • 状态模式角色

    (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("该用户已经被禁止获取代金券");
    }
}

  • 状态模式优点

设计模式——状态模式

标签:uml图   contex   用户   man   etc   对象   void   接口   管理类   

原文地址:https://www.cnblogs.com/boycelee/p/8683595.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!