状态模式

状态模式

定义:当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类。
使用场景:
  • 一个对象的行为取决于它的状态,并且它必须在运行时刻根据状态改变它的行为。
  • 一个操作中含有庞大的多分支结构(if..else),并且这些分支决定于对象的状态。
类图:

这里写图片描述

模式中的角色:
  • 上下文环境(Context):它定义了客户程序需要的接口并维护一个具体状态角色的实例,将与状态相关的操作委托给当前的Concrete State对象来处理。
  • 抽象状态(State):定义一个接口以封装使用上下文环境的的一个特定状态相关的行为。
  • 具体状态(Concrete State):实现抽象状态定义的接口。
状态模式与策略模式:

两者的类图是一样的,模式结构一样,但是他们的设计意图是不一样的,策略模式是定义了一族算法,通过策略模式来改变类的行为。状态模式是当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类。两者的设计意图是不一样的。

代码示例

Context类

public class Context {

    private State state;

    public Context(State state) {
        this.state = state;
    }

    public void open() {
        state.open(this);
    }

    public void close() {
        state.close(this);
    }

    public State getState() {
        return state;
    }

    public void setState(State state) {
        this.state = state;
    }
}

State类:

public abstract class State {
    void open(Context context) {
    }

    void close(Context context) {
    }
}

OpenState类:

public class OpenState extends State {

    @Override
    public void close(Context c) {
        Log.e("zhang", "关门");
        if (c!=null){
            c.setState(new CloseState());
        }
    }
}

CloseState类:

public class CloseState extends State {
    @Override
    public void open(Context c) {
        Log.e("zhang", "开门");
        if (c != null) {
            c.setState(new OpenState());
        }
    }
}

测试类:

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        State state = new OpenState();
        Context context = new Context(state);
        context.close();
        context.open();
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值