欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Android设计模式------状态变化模式

程序员文章站 2022-06-09 21:29:46
...

State 状态模式

使用场景

在软件构建过程中,某些对象的状态如果改变,其行为也会随之而发生变化,比如文档处于只读状态,其支持的行为和读写状态支持的行为就可能完全不同。

模式定义

允许一一个对象在其内部状态改变时改变它的行为。从而使对象看起来似乎修改了其行为。

类图结构

Android设计模式------状态变化模式
代码举例

比如编写网络应用程序

public enum NetworkState  //枚举方式是编译时依赖  更改的时候导致源代码更改
{   //有4种网络状态
    Open,
    Close,
    Connect,
    Waiting,  //如果添加Waiting 就会添加修改代码  违背了开闭原则
}

//网络处理器
public class NetworkProcessor{
    
    NetworkState state;

    public void Operation1(){

        switch (state){
            case Open:
                //**********
                state = NetworkState.Close;
                break;
            case  Close:
                //..........
                state = NetworkState.Connect;
                break;
            case  Connect:
                //$$$$$$$$$$
                state = NetworkState.Open;
                break;

        }
    }

    public void Operation2(){

        switch (state){
            case Open:
                //**********
                state = NetworkState.Connect;
                break;
            case  Close:
                //..........
                state = NetworkState.Open;
                break;
            case  Connect:
                //$$$$$$$$$$
                state = NetworkState.Close;
                break;
        }
    
    }

    public void Operation3(){
        //...
    }
}

对代码进行重构


//支持了扩展的方式 支持需求变化
public abstract class NetworkState{


    public NetworkState next;

    public abstract void Operation1();
    public abstract void Operation2();
    public abstract void Operation3();

}

public class OpenState extends NetworkState{
//用多态的方式来实现状态的变化

    @Override
    public void Operation1(){
        
        //**********
        next = new CloseState();
    }

    @Override
    public void Operation2(){
        
        //..........
        next = new ConnectState();
    }

    @Override
    public void Operation3(){
        
        //$$$$$$$$$$
        next = new OpenState();
    }

}

public class CloseState extends NetworkState{


    @Override
    public void Operation1(){

        //**********
        next = new ConnectState();
    }

    @Override
    public void Operation2(){

        //..........
        next = new OpenState();
    }

    @Override
    public void Operation3(){

        //$$$$$$$$$$
        next = new CloseState();
    }

}

public class ConnectState extends NetworkState{ }

public class WaitingState extends NetworkState{ }  //添加Waiting状态 对于NetworkProcessor类 没有影响 
//...

//NetworkProcessor现在是稳定状态  不管状态如果改变 操作逻辑还是不变的

class NetworkProcessor{
    
    NetworkState state;



    public NetworkProcessor(NetworkState state){
        
        this.state = state;
    }
    
    public void Operation1(){
        //...
        state.Operation1();  //多态方式 支持 运行时 变化
        state = state.next; //状态改变
        //...
    }

    public void Operation2(){
        //...
        state.Operation2();  //行为也跟着变化
        state = state.next;
        //...
    }

    public void Operation3(){
        //...
        state.Operation3();
        state = state.next;
        //...
    }

}

类图结构中 State 对应代码中的 NetworkState。Context 对应代码中的 NetworkProcessor。

State 和 Context 是稳定的。ConcreteStateA 和  ConcreteStateB 是变化的。通过子类化支持变化,以扩展的方式应对新的变化需求。

要点总结

  State模式将所有与一个特定状态相关的行为都放入一个State的子类对象中,在对象状态切换时,切换相应的对象;但同时维持
State的接口,这样实现了具体操作与状态转换之间的解耦。
  为不同的状态引入不同的对象使得状态转换变得更加明确,而且可以保证不会出现状态不一 致的情况,因为转换是原子性的一 即要么彻底转换过来,要么不转换。
  如果State对象没有实例变量,那么各个上下文可以共享同一个State对象,从而节省对象开销。