设计模式之状态模式

117 阅读2分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第26天,点击查看活动详情

简介

状态模式的定义:

Allow an object to alter its behavior when its internal state changes.The object will appear to change its class. 中文翻译过来当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类。

这个定义也太抽象了,反正我是没理解。经过看实际的代码实现,我对它的理解是将对象的状态抽象出一个接口或抽象类,然后根据它的不同状态封装其行为,这样就可以实现状态和行为的绑定,最终实现对象和状态的有效解耦。

案例

状态模式中一般有三个角色

Context:用于保存状态拥有者当前的【状态】是什么

State:状态拥有者主体的抽象定义

ConcreteState:状态真实的拥有者

首先定义一个状态的抽象定义,定义一个状态的名称,一个方法处于该状态下要做的事:

public abstract class State {
    protected String name;
    public State(String name) {
        this.name = name;
    }
    public abstract void doSth(Context context);
}

然后定义一个吃的类与一个睡觉的类,分别由一个构造方法设置其名称,然后重写抽象类的doSth方法,方法体内模拟改变此类的状态,并将此状态设置到Context类中保存。

public class Eat extends State {
    public Eat(String name) {
        super(name);
    }
    @Override
    public void doSth(Context context) {
        System.out.println("start eat");
        context.setState(this);
    }
}
public class Sleep extends State {
    public Sleep(String name) {
        super(name);
    }
    @Override
    public void doSth(Context context) {
        System.out.println("start sleep");
        context.setState(this);
    }
}

定义一个Context类用于保存Eat和Sleep类的状态:

public class Context {
    private State state;
    public State getState() {
        return state;
    }
    public void setState(State state) {
        this.state = state;
    }
}

测试类中当eat切换状态时,在context中保存的状态也改变了

public class App {
    public static void main(String[] args) {
        Context context = new Context();
        Eat eat = new Eat("eat");
        eat.doSth(context);
        System.out.println(context.getState().name);
        Sleep sleep = new Sleep("sleep");
        sleep.doSth(context);
        System.out.println(context.getState().name);
    }
}

总结

使用一番之后觉得状态模式和策略模式是有相似的地方的。咱们使用的时候要注意区分,重点关注行为随状态改变而改变的场景,还有一点是就状态模式同样可以替代条件、分支语句。