博客
关于我
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/

    你可能感兴趣的文章
    Objective-C实现all combinations所有组合算法(附完整源码)
    查看>>
    Objective-C实现all permutations所有排列算法(附完整源码)
    查看>>
    Objective-C实现all subsequences所有子序列算法(附完整源码)
    查看>>
    Objective-C实现AlphaNumericalSort字母数字排序算法(附完整源码)
    查看>>
    Objective-C实现alternate disjoint set不相交集算法(附完整源码)
    查看>>
    Objective-C实现alternative list arrange备选列表排列算法(附完整源码)
    查看>>
    Objective-C实现An Armstrong number阿姆斯特朗数算法(附完整源码)
    查看>>
    Objective-C实现anagrams字谜算法(附完整源码)
    查看>>
    Objective-C实现ApproximationMonteCarlo蒙特卡洛方法计算pi值算法 (附完整源码)
    查看>>
    Objective-C实现area under curve曲线下面积算法(附完整源码)
    查看>>
    Objective-C实现argmax函数功能(附完整源码)
    查看>>
    Objective-C实现arithmetic算术算法(附完整源码)
    查看>>
    Objective-C实现armstrong numbers阿姆斯壮数算法(附完整源码)
    查看>>
    Objective-C实现articulation-points(关键点)(割点)算法(附完整源码)
    查看>>
    Objective-C实现atoi函数功能(附完整源码)
    查看>>
    Objective-C实现average absolute deviation平均绝对偏差算法(附完整源码)
    查看>>
    Objective-C实现average mean平均数算法(附完整源码)
    查看>>
    Objective-C实现average median平均中位数算法(附完整源码)
    查看>>
    Objective-C实现average mode平均模式算法(附完整源码)
    查看>>
    Objective-C实现avl 树算法(附完整源码)
    查看>>