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

State 状态模式

在状态模式(State Pattern)中,类的行为是基于它的状态改变的。这种类型的设计模式属于行为型模式。

在状态模式中,我们创建表示各种状态的对象和一个行为随着状态对象改变而改变的 context 对象。

意图:允许对象在内部状态发生改变时改变它的行为,对象看起来好像修改了它的类。

主要解决:对象的行为依赖于它的状态(属性),并且可以根据它的状态改变而改变它的相关行为。

何时使用:代码中包含大量与对象状态有关的条件语句。

如何解决:将各种具体的状态类抽象出来。

关键代码:通常命令模式的接口中只有一个方法。而状态模式的接口中有一个或者多个方法。而且,状态模式的实现类的方法,一般返回值,或者是改变实例变量的值。也就是说,状态模式一般和对象的状态有关。实现类的方法有不同的功能,覆盖接口中的方法。状态模式和命令模式一样,也可以用于消除 if...else 等条件选择语句。

应用实例: 1、打篮球的时候运动员可以有正常状态、不正常状态和超常状态。 2、曾侯乙编钟中,'钟是抽象接口','钟A'等是具体状态,'曾侯乙编钟'是具体环境(Context)。

优点: 1、封装了转换规则。 2、枚举可能的状态,在枚举状态之前需要确定状态种类。 3、将所有与某个状态有关的行为放到一个类中,并且可以方便地增加新的状态,只需要改变对象状态即可改变对象的行为。 4、允许状态转换逻辑与状态对象合成一体,而不是某一个巨大的条件语句块。 5、可以让多个环境对象共享一个状态对象,从而减少系统中对象的个数。

缺点: 1、状态模式的使用必然会增加系统类和对象的个数。 2、状态模式的结构与实现都较为复杂,如果使用不当将导致程序结构和代码的混乱。 3、状态模式对"开闭原则"的支持并不太好,对于可以切换状态的状态模式,增加新的状态类需要修改那些负责状态转换的源代码,否则无法切换到新增状态,而且修改某个状态类的行为也需修改对应类的源代码。

使用场景: 1、行为随状态改变而改变的场景。 2、条件、分支语句的代替者。

注意事项:在行为受状态约束的时候使用状态模式,而且状态不超过 5 个。

使用场景

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

模式定义

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

类图结构


代码举例

比如编写网络应用程序

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对象,从而节省对象开销。
 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值