状态模式:设计模式系列(八)

  状态模式(State Pattern):是将一些对象相关的动作以算法形式封装起来,在对象在动作的时候,根据对象的状态选择对应的算法方法进行的设计模式,归类为行为型模式。

  这一模式的解读分为以下几个方面:

  • 一个对象有很多状态。
  • 多种状态之间需要转换。
  • 对象方法需要被封装。

  使用状态模式的思考过程如下:

  1. 需要调用一个对象,但这个对象有很多种状态。
  2. 对象的这些状态之间可以互相转换。

  明确一下结构,状态模式结构包含上下文类、状态类、状态类抽象出来的接口或协议。

状态模式示例代码如下(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

  总结:状态模式是一种扩展性很强的设计模式,并且解放了庞大了控制流语句,但是因为状态转换过程非透明,所以状态与状态间的依然具有一定的耦合关系,假如转换状态逻辑需要改变,那么相关的状态也可能要作出修改,但依然掩盖不了强大灵活性的有点。


lZackx © 2022. All rights reserved.

Powered by Hydejack v9.1.6