Bootstrap

设计模式——状态模式

目录

概念

模式结构

案例示范

创建State抽象类

创建状态类 并 继承于 State

创建Context类 (此处为Work)

客户端代码

概念

状态模式:当一个对象在内在状态改变时允许改变其行为,这个行为看起来像是改变了其类

状态! 顾名思义 , 一个对象在一段时间所呈现的不同形态 。 比如:

电梯状态 : 有上升 、下降、停止、运行 四个状态。

一个人的工作状态 : 早上很清晰 , 中午犯困 , 下午饿了!? 晚上又困了!

……

模式结构

将特定的状态相关的行为都放入一个对象中 , 由于所有与状态相关的代码都存在于某个 State 中 , 所以通过定义新的子类可以很容易地添加新的状态和转换。

状态模式通过把各种状态转移逻辑到State的子类之间 , 来减少依赖

什么时候用状态模式呢 ?

答: 当一个对象的行为取决于它的状态,并且它必须在运行时刻根据状态改变它的行为时候,就可以考虑使用状态模式了。

案例示范

talk is easy  , show me the code!

背景:一个人在早上或者中午、下午、晚上有诸多状态 , 我们以此为例,展示本模式

创建State抽象类

public abstract class State {
    public abstract void proggram(Work work);
}

创建状态类 并 继承于 State

// 早上状态
public class ForenoonState extends State{
    @Override
    public void proggram(Work work) {
        if(work.getHour() < 12) {
            System.out.println("早上 , 精神好");
        }else {
            work.setState(new NoonState());
            work.excute();
        }
    }
}
// 中午状态
public class NoonState extends State{
    @Override
    public void proggram(Work work) {
        if(work.getHour() < 13) {
            System.out.println("中午啦,有点困了");
        }else {
            work.setState(new AfterState());
            work.excute();
        }
    }
}
// 下午状态
public class AfternoonState extends State{
    @Override
    public void proggram(Work work) {
        System.out.println("下午了");
    }
}

创建Context类 (此处为Work)

public class Work {
    int hour;
    private  State state;
    public Work(){
        state  = new ForenoonState();
    }

    public int getHour() {
        return hour;
    }

    public void setHour(int hour) {
        this.hour = hour;
    }

    public State getState() {
        return state;
    }

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

客户端代码

public class Client {
    public static void main(String[] args) {
        Work work = new Work();
        work.setHour(13);
        work.excute();
    }
}

// 结果 :下午了

用状态模式, 将工作状态与相关的行为 (早上了 ,中午了……)局部化 , 将不同状态的行为分隔开来。

;