本文共 3198 字,大约阅读时间需要 10 分钟。
状态模式是软件设计中一种常用的行为模式,能够通过保持对象的状态来改变其行为表现,从而让对象看起来像在改变类似的效果。这种模式的核心思想是将状态与行为分割,使得系统可以在不修改对象类的前提下,灵活配置和扩展不同的行为。
状态模式的核心是将行为与状态分开,通过状态的变化来实现行为的不同。状态决定行为,可以理解为:状态和行为是紧密关联的,状态切换会带来行为的变化。这种设计模式的优势在于它可以让系统在不使用多态的情况下,只需维护状态的变化,就能动态改变对象的行为表现。
状态模式的典型结构包括以下几个关键角色:
环境类 (Context):
抽象状态类 (Abstract State):
具体状态类 (Concrete State):
状态模式在实际项目中有很多应用场景,以下是两种典型示例:
为了防止用户恶意刷票,系统可以采用状态模式来管理用户的投票行为。系统需要维护以下状态:
系统的实现逻辑如下:
环境类 VoteManager 负责维护当前状态,并根据用户的投票次数切换状态:
蚂蚁庄园中,小鸡的状态切换是系统行为的重要组成部分。状态模式可以帮助系统更好地管理小鸡的行为。
环境类 AntFarmContext 管理蚂蚁庄园的状态,具体实现如下:
状态切换逻辑如下:
下面是状态模式的伪代码实现示例:
// 投票管理系统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/