前言
本篇来谈谈状态模式。
正文
概念
状态模式属于行为型模式,在这个模式中类的行为是根据类的状态发生改变的。在类中维护一个状态变量,当其改变时类的行为就发生改变,看上去就跟改变了类本身一样。
那状态模式涉及的角色有:
- 环境(context):上下文,通常定义客户端可用的接口,内部维护一个状态实例,根据这个状态做出不一样的行为。
- 抽象状态(state):一个接口,用于封装环境(context)对象的状态
- 具体状态(concreteState):实现抽象状态。
那这个模式常见的场景就是可以替代条件语句,if,switch等等,避免语句过长。
实现
这个模式还是比较简单的,我们就写写上面提到的几个角色
我们先定义state接口:
1 | public interface State { |
然后是具体的state
1 | public class ConcreteStateA implements State{ |
然后定义环境,用于客户端的调用
1 | public class Context { |
最后编写客户端调用
1 | public class Client { |
可以发现,通过设置context的状态可以实现不同的操作。看上去就像context对象本身发生改变一样。
优缺点
最后来讲讲优缺点。
状态模式的优点有,把实现的细节隐藏,客户端只需要设置状态,无需关心内部的实现,并且可以去除大量的逻辑判断语句,可读性更高。
而缺点在于当状态增多时,类的数量会增加,并且当增加新的状态类时,context可能会做出修改,不符合开闭原则。