设计模式:状态模式

Posted gcm688

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了设计模式:状态模式相关的知识,希望对你有一定的参考价值。

  遇到这样的场景时,如: 红绿灯状态不同,行人的行为不同。网上购物时,订单有不同的状态。

电梯的运行状态,维修,自动关门,开门,向上,向下等这些不同的状态对应不同的行为时可以将状态统一封装

采用状态模式来避免代码业务的耦合度过高。

  用一句话来描述,状态模式把所研究的对象的行为包装在不同对象里,每一个状态对象都属于一个抽象状态

的子类,状态模式的意图是让一个对象在其内部状态改变的时候,其行为也随之改变。

组成:

  环境类(Context):  定义客户端需要的接口,并且负责具体状态的切换。
  抽象状态类(State):  接口或抽象类,负责对象状态定义,并且封装环境角色以实现状态切换。
  具体状态类(ConcreteState):  具体状态主要有两个职责:一是处理本状态下的事情,二是从本状态如何过渡到其他状态。

 

例子:

  模拟一个用户系统登录,用户的状态有,logout,login,当用户通过账户和密码验证后状态为login, 当用户退出时状态为logout.

使用抽象状态类限定了所有的表示不同行为的状态,它的子类实现了由状态决定的行为。

/**
 * 抽象状态类
 */
public interface State {
    void handle();
}

  子类实现

public class UserLoginState implements State {
    @Override
    public void handle() {
        System.out.println("用户通过密码验证状态login");
    }
}

  

public class UserLogOutState implements State {
    @Override
    public void handle() {
        System.out.println("用户通过密码验证状态logOut");
    }
}

  环境类持有一个状态对象,来表示目前的状态,接受所有状态相关请求,并委派给具体的状态对象处理

public class Context {
    //持有状态对象
    private State state;


    public void setState(State s){
        System.out.println("修改状态");
        state = s;
        state.handle();
    }
}

  

public class Client {

    public static void main(String[] args) {
        Context ctx = new Context();

        ctx.setState(new UserLoginState());
        ctx.setState(new UserLogOutState());
    }
}

  

修改状态
用户通过密码验证状态login
修改状态
用户通过密码验证状态logOut

Process finished with exit code 0

  状态模式达到的效果:

    由于对系统所有的状态抽象一个子类,当系统变化时,只需要改变所选的子类。同样如果要新增状态,也只需要增加新的子类。

    由于没一个状态都被包装到类里,在代码业务处理时省去了大量的if..else判断。

 使用场景:

  1.当一个对象的行为依赖它所处的状态,也就是对象的行为随状态改变而改变。

  2.当某个方法中存在大量的条件语句,可以考虑把这些条件语句抽象到状态类中单独维护。



以上是关于设计模式:状态模式的主要内容,如果未能解决你的问题,请参考以下文章

用于从 cloudkit 检索单列的代码模式/片段

是否有在单个活动中处理多个片段的 Android 设计模式?

方向/配置更改后如何维护 ListView 片段状态?

为不同方向使用不同布局时,在方向更改时保存片段状态

Sublime text3最全快捷键清单

csharp C#代码片段 - 使类成为Singleton模式。 (C#4.0+)https://heiswayi.github.io/2016/simple-singleton-pattern-us