状态模式:设计模式系列(八)
in Archived / Pattern
状态模式(State Pattern):是将一些对象相关的动作以算法形式封装起来,在对象在动作的时候,根据对象的状态选择对应的算法方法进行的设计模式,归类为行为型模式。
这一模式的解读分为以下几个方面:
- 一个对象有很多状态。
- 多种状态之间需要转换。
- 对象方法需要被封装。
使用状态模式的思考过程如下:
- 需要调用一个对象,但这个对象有很多种状态。
- 对象的这些状态之间可以互相转换。
明确一下结构,状态模式结构包含上下文类、状态类、状态类抽象出来的接口或协议。
状态模式示例代码如下(Swift语言):
class ObjectContext{
private var objectState:ObjectStateBluePrint = ObjectState1();
func excute(objectState:ObjectStateBluePrint){
self.objectState = objectState;
}
func request(){
self.objectState.handler(self);
}
}
protocol ObjectStateBluePrint{
func handler(context:ObjectContext);
}
class ObjectState1: ObjectStateBluePrint{
func handler(context:ObjectContext){
print("State 1 to 2");
context.excute(ObjectState2());
}
}
class ObjectState2: ObjectStateBluePrint{
func handler(context:ObjectContext){
print("State 2 to 3");
context.excute(ObjectState3());
}
}
class ObjectState3: ObjectStateBluePrint{
func handler(context:ObjectContext){
print("State 3 to 1");
context.excute(ObjectState1());
}
}
var context = ObjectContext();
context.request();
context.request();
context.request();
代码分析:ObjectContext
就是一个具有很多状态的实现类,ObjectStateBluePrint
是从状态实现类抽象出来的协议,这里的状态写得比较简单,并且状态会自动转换,按照ObjectState1
-ObjectState2
-ObjectState3
这种循环转换,其中要注意的是,因为使用类这种转换方式,所以handler
方法需要带一个ObjectContext
类型的参数,如果有另外一种转换方式,此参数或许是可以不带的。以上代码的输出如下:
State 1 to 2
State 2 to 3
State 3 to 1
总结:状态模式是一种扩展性很强的设计模式,并且解放了庞大了控制流语句,但是因为状态转换过程非透明,所以状态与状态间的依然具有一定的耦合关系,假如转换状态逻辑需要改变,那么相关的状态也可能要作出修改,但依然掩盖不了强大灵活性的有点。