23种设计模式之状态模式
2019-01-29 本文已影响0人
阿跳爱学习
优点:避免大量的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
已完成测试!有不对的地方欢迎指出,感恩。