设计模式——状态模式

Posted boycelee

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了设计模式——状态模式相关的知识,希望对你有一定的参考价值。

状态模式定义

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

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


  • 状态模式角色

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

  • 状态模式优点





以上是关于设计模式——状态模式的主要内容,如果未能解决你的问题,请参考以下文章

用于从 cloudkit 检索单列的代码模式/片段

是否有在单个活动中处理多个片段的 Android 设计模式?

方向/配置更改后如何维护 ListView 片段状态?

为不同方向使用不同布局时,在方向更改时保存片段状态

Sublime text3最全快捷键清单

csharp C#代码片段 - 使类成为Singleton模式。 (C#4.0+)https://heiswayi.github.io/2016/simple-singleton-pattern-us