23种设计模式之状态模式

优点:避免大量的If/else导致代码臃肿,更灵活、便于维护与扩展。
缺点:类个数增加,使用不当程序结构会比较混乱。

主要有以下角色:

  • Context(环境类):环境类种维护了一个State对象,它定义了当前状态。
  • State(抽象状态类):定义具体状态类需要实现的方法。
  • ConcreteState(具体状态类):封装了一个状态对应的行为。

主要用于解决系统中复杂的状态切换。

例子:以网上购物为例,从简,只分三个状态:
1.已发货
2.送货中
3.已收货

创建State抽象状态类:

/**
 * State(抽象状态类):定义具体状态类需要实现的方法。
 */

public interface State {
    void handle();
}

创建ConcreteState具体状态类,并实现State 接口:

import android.util.Log;

/**
 * 1.已发货
 */

public class Shipped implements State {

    @Override
    public void handle() {
        Log.d("TAG", "1:已发货");
    }
}
import android.util.Log;

/**
 * 2.送货中
 */

public class InDelivery implements State {

    @Override
    public void handle() {
        Log.d("TAG", "2:送货中");
    }
}
import android.util.Log;

/**
 * 3.已收货
 */

public class Received implements State{

    @Override
    public void handle() {
        Log.d("TAG","3:已收货");
    }
}

创建Context环境类,环境类种维护了一个State对象,它定义了当前状态:

import android.util.Log;

/**
 * Context环境类,环境类种维护了一个State对象,它定义了当前状态
 */

public class MyContext {

    private State state;

    public void setState(State state){
        Log.d("TAG","状态发生改变!");
        this.state = state;
        state.handle();
    }
}

调用:

import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v4.app.FragmentActivity;

/**
 * 这是调用者
 */

public class MainActivity extends FragmentActivity {
    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        MyContext context = new MyContext();
        context.setState(new Shipped());
        context.setState(new InDelivery());
        context.setState(new Received());
    }
}

结果:
image.png

已完成测试!有不对的地方欢迎指出,感恩。

你可能感兴趣的:(23种设计模式之状态模式)