java设计模式之状态模式
状态模式的定义:状态模式也叫作状态机模式,运行对象在内部状态发生改变时改变它的行为,对象看起来好像修改了它的类,属于行为型设计模式。 状态模式中类的行为是由状态决定的,在不同的状态下有不同的行为。其意图是让一个对象在其内部改变的时候,行为也随之改变。 状态模式的核心是装态与行为绑定,不同的状态对应不同的行为。 状态模式的应用场景:
状态模式的UML类图:状态模式的UML类图就不画了,因为它和策略模式的UML类图基本一致,它们都包含三个角色, 其中环境类角色(Context)分别是负责切换策略和状态,抽象角色分别是定义不同策略和不同状态 的行为,具体角色分别是策略的具体实现和状态的具体实现,唯一的区别是状态模式在完成某个状态 的行为之后还有可能会切换到其他状态。 使用状态模式实现登录状态自由切换:当我们浏览博客园的文章时,如果我们觉得文章很好,忍不住想评论、收藏。但是如果我们处于未登录的状态,就会自动跳转到登录页面 这里涉及到的状态有两种登录和未登录,行为有评论和收藏。下面使用状态模式来实现这个逻辑,代码如下。 首先创建抽象状态角色类,定义评论和收藏两个行为 public abstract class UserState { protected AppContext context; void setContext(AppContext context) { this.context = context; } favorite(); comment(String comment); } 然后创建未登录状态类,定义在未登录状态下,两种行为的具体实现 class UnLoginState extends UserState { @Override favorite() { this.switch2login(); .context.getState().favorite(); } @Override comment(String comment) { .context.getState().comment(comment); } private switch2login(){ System.out.println("跳转到登录页!"); this.context.setState(.context.STATE_LOGIN); } } 创建登录状态类,定义在登录状态下,两种行为的具体实现 class LoginState UserState { @Override favorite() { System.out.println("收藏成功!"); } @Override comment(String comment) { System.out.println(comment); } } 创建上下文角色类,根据登录状态切换具体的行为 AppContext { static final UserState STATE_LOGIN = new LoginState(); final UserState STATE_UNLOGIN = UnLoginState(); private UserState currentState = STATE_UNLOGIN; { STATE_LOGIN.setContext(); STATE_UNLOGIN.setContext(); } setState(UserState state){ this.currentState = state; } public UserState getState(){ return .currentState; } favorite(){ .currentState.favorite(); } comment(String comment){ .currentState.comment(comment); } } 最后编写客户端测试代码。 Test { main(String[] args) { AppContext context = AppContext(); context.favorite(); context.comment("评论:好文章,360个赞"); } } 状态模式和责任链模式的区别:
状态模式和策略模式的区别:状态模式和策略模式的UML类图架构几乎完全一样,但两者的应用场景是不一样的。策略模式的多种算法行为则其一都能满足,彼此之间是独立的,用户可自行更换策略算法;而 状态模式的各个状态之间存在相互关系,彼此之间一定的条件下存在自动切换的效果,并且用户无法指定状态,只能设置初始状态,因为状态是根据行为而改变的。 状态模式的优点:
状态模式的缺点:
? (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |