博客
关于我
java设计模式--状态模式
阅读量:598 次
发布时间:2019-03-12

本文共 3198 字,大约阅读时间需要 10 分钟。

状态模式是软件设计中一种常用的行为模式,能够通过保持对象的状态来改变其行为表现,从而让对象看起来像在改变类似的效果。这种模式的核心思想是将状态与行为分割,使得系统可以在不修改对象类的前提下,灵活配置和扩展不同的行为。

状态模式的基本概念

状态模式的核心是将行为与状态分开,通过状态的变化来实现行为的不同。状态决定行为,可以理解为:状态和行为是紧密关联的,状态切换会带来行为的变化。这种设计模式的优势在于它可以让系统在不使用多态的情况下,只需维护状态的变化,就能动态改变对象的行为表现。

状态模式的基本结构

状态模式的典型结构包括以下几个关键角色:

  • 环境类 (Context):

    • 负责维护当前系统的状态实例。
    • 提供状态切换的接口。
  • 抽象状态类 (Abstract State):

    • 定义一个接口,声明所有状态类必须实现的公共方法。
  • 具体状态类 (Concrete State):

    • 分别实现抽象状态类中定义的方法,每个具体状态类对应一个特定的行为逻辑。

状态模式的应用场景

状态模式在实际项目中有很多应用场景,以下是两种典型示例:

场景一:在线投票系统

为了防止用户恶意刷票,系统可以采用状态模式来管理用户的投票行为。系统需要维护以下状态:

  • 正常投票状态 (NormalVoteState): 允许用户正常投票。
  • 反复投票状态 (RepeatVoteState): 提示用户已投过一次,请勿重复投票。
  • 恶意刷票状态 (SpiteVoteState): 取消用户的投票资格。
  • 黑名单状态 (BlackVoteState): 禁止用户进入系统。

系统的实现逻辑如下:

环境类 VoteManager 负责维护当前状态,并根据用户的投票次数切换状态:

  • 用户投票一次,系统记录投票次数,并切换为反复投票状态。
  • 如果用户再次投票,系统切换为恶意刷票状态。
  • 系统取消用户投票记录,并切换为黑名单状态。
  • 如果投票次数超过限制,系统切换为黑名单状态,并禁止用户继续操作。
  • 场景二:支付宝蚂蚁庄园

    蚂蚁庄园中,小鸡的状态切换是系统行为的重要组成部分。状态模式可以帮助系统更好地管理小鸡的行为。

    环境类 AntFarmContext 管理蚂蚁庄园的状态,具体实现如下:

  • 邀请状态 (EatingState): 邀请别的小鸡进入庄园。
  • 访客状态 (InvistorState): 已有访客,禁止重复邀请。
  • 状态切换逻辑如下:

  • 初始状态为 邀请状态,用户成功邀请后切换为 访客状态
  • 访客状态 内,用户可以选择将访客sendway,切换回 邀请状态
  • 状态模式的优点

  • 行为的灵活性增强: 状态模式允许系统在不改变对象类的前提下,动态变化对象的行为。
  • 状态的封装性: 状态模式通过封装状态的行为,使得系统容易扩展和维护。
  • 减轻条件判断的压力: 与其他设计模式如策略模式相比,状态模式通过状态的切换来避免复杂的条件判断。
  • 可ieee开发: 状态模式可以提高系统的可ieee性,便于统一管理和扩展不同的行为配置。
  • 状态模式的代码实现

    下面是状态模式的伪代码实现示例:

    // 投票管理系统
    public interface VoteState {
    void vote(String user, String voteItem, VoteManager voteManager);
    }
    public class NormalVoteState implements VoteState {
    @Override
    public void vote(String user, String voteItem, VoteManager voteManager) {
    System.out.println("投票成功");
    voteManager.getMapVote().put(user, voteItem);
    }
    }
    public class RepeatVoteState implements VoteState {
    @Override
    public void vote(String user, String voteItem, VoteManager voteManager) {
    System.out.println("已投过,请等待");
    }
    }
    public class SpiteVoteState implements VoteState {
    @Override
    public void vote(String user, String voteItem, VoteManager voteManager) {
    if (voteManager.getMapVote().get(user) != null) {
    voteManager.getMapVote().remove(user);
    }
    System.out.println("取消投票资格");
    }
    }
    public class BlackVoteState implements VoteState {
    @Override
    public void vote(String user, String voteItem, VoteManager voteManager) {
    System.out.println("您已进入黑名单");
    }
    }
    public class VoteManager {
    private VoteState current_state = null;
    private Map
    mapVote = new HashMap<>();
    private Map
    mapVoteCount = new HashMap<>();
    public void vote(String user, String voteItem) {
    int count = mapVoteCount.getOrDefault(user, 0) + 1;
    mapVoteCount.put(user, count);
    if (count == 1) {
    current_state = new NormalVoteState();
    } else if (count > 1 && count < 5) {
    current_state = new RepeatVoteState();
    } else if (count >= 5 && count < 8) {
    current_state = new SpiteVoteState();
    } else if (count >= 8) {
    current_state = new BlackVoteState();
    }
    current_state.vote(user, voteItem, this);
    }
    }

    小结

    状态模式通过分离状态和行为,提供了一个灵活且可扩展的行为配置机制。其核心优势在于状态驱动行为变化,能够在不修改对象类的前提下,动态改变对象的行为表现。在实际应用中,状态模式广泛应用于需要管理多状态对象行为的场景,如权限管理、用户状态管理、信号灯示例等。

    转载地址:http://fsgtz.baihongyu.com/

    你可能感兴趣的文章
    Nginx - 反向代理、负载均衡、动静分离、底层原理(案例实战分析)
    查看>>
    nginx 1.24.0 安装nginx最新稳定版
    查看>>
    nginx 301 永久重定向
    查看>>
    nginx css,js合并插件,淘宝nginx合并js,css插件
    查看>>
    Nginx gateway集群和动态网关
    查看>>
    Nginx Location配置总结
    查看>>
    Nginx log文件写入失败?log文件权限设置问题
    查看>>
    Nginx Lua install
    查看>>
    nginx net::ERR_ABORTED 403 (Forbidden)
    查看>>
    Nginx SSL私有证书自签,且反代80端口
    查看>>
    Nginx upstream性能优化
    查看>>
    Nginx 中解决跨域问题
    查看>>
    nginx 代理解决跨域
    查看>>
    Nginx 动静分离与负载均衡的实现
    查看>>
    Nginx 反向代理 MinIO 及 ruoyi-vue-pro 配置 MinIO 详解
    查看>>
    nginx 反向代理 转发请求时,有时好有时没反应,产生原因及解决
    查看>>
    Nginx 反向代理解决跨域问题
    查看>>
    Nginx 反向代理配置去除前缀
    查看>>
    nginx 后端获取真实ip
    查看>>
    Nginx 多端口配置和访问异常问题的排查与优化
    查看>>