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

本文共 3148 字,大约阅读时间需要 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 后端获取真实ip
    查看>>
    Nginx 学习总结(16)—— 动静分离、压缩、缓存、黑白名单、性能等内容温习
    查看>>
    Nginx 学习总结(17)—— 8 个免费开源 Nginx 管理系统,轻松管理 Nginx 站点配置
    查看>>
    Nginx 常用配置清单
    查看>>
    nginx 常用配置记录
    查看>>
    Nginx 我们必须知道的那些事
    查看>>
    Nginx 的 proxy_pass 使用简介
    查看>>
    Nginx 的配置文件中的 keepalive 介绍
    查看>>
    Nginx 负载均衡与权重配置解析
    查看>>
    Nginx 负载均衡详解
    查看>>
    nginx 配置 单页面应用的解决方案
    查看>>
    nginx 配置https(一)—— 自签名证书
    查看>>
    nginx 配置~~~本身就是一个静态资源的服务器
    查看>>
    Nginx 配置解析:从基础到高级应用指南
    查看>>
    nginx+Tomcat性能监控
    查看>>
    Nginx下配置codeigniter框架方法
    查看>>
    nginx报错:the “ssl“ parameter requires ngx_http_ssl_module in /usr/local/nginx/conf/nginx.conf:128
    查看>>
    nginx添加模块与https支持
    查看>>
    Nginx用户认证
    查看>>
    Nginx的Rewrite正则表达式,匹配非某单词
    查看>>