Java状态模式

状态模式,主要解决用于控制对象的一个条件过于复杂时,把状态的判断逻辑移到一系列表示状态的类中。就是把对象的多种状态,每一个状态都写成一个类,然后判断最终实现哪一个类,让各自的状态在各自的类中完成。

我们拿一天的工作举例子,上午去上班,开始工作,中午午睡,下午继续工作,工作完成的话就回家,没完成就继续加班,最后困死在工作桌上。

  在学状态模式之前,我们肯定是习惯的用多个if去判断状态。

public class function {
    public static void main(String []args){
        Work1 work=new Work1();
        work.finished=false;
        work.Hour=22;
        work.workState(work.Hour);
    }
}
class Work1{
    int Hour;
    boolean finished;
    public void workState(int Hour){
        this.Hour=Hour;
        if (Hour<12){
            System.out.println("上午开始工作"+Hour);
        } else if (Hour<13) {
            System.out.println("午睡"+Hour);
        } else if (Hour<17) {
            System.out.println("下午继续工作"+Hour);
        }
        else {
            if (finished==true){
                System.out.println("下班回家"+Hour);
            }
            else {
                if (Hour>21)
                    System.out.println("困死了"+Hour);
                else System.out.println("加班"+Hour);
            }
        }
    }
}

在写代码时,一个方法过于长其实是不好的,而且如果我们想要增加一个新的状态,会很麻烦,不仅要更改原有的类,而且我们还需要谨慎考虑改状态应该写在哪个if中。这违反了单一职责原则和开放-封闭原则。

  状态模式的应用:

public class StateModel {
    public static void main(String[] args) {
        work w1 = new work();
        w1.setHour(22);
        w1.setFinished(false);
        w1.goingState();
    }
}

interface state {
    public void setState(work w);
}

class morning implements state {
    public void setState(work w) {
        if (w.Hour < 12) {
            System.out.println("上午开始上班 " + w.Hour);
        } else {
            w.transformState(new noon());
            w.goingState();
        }
    }
}

class noon implements state {
    public void setState(work w) {
        if (w.Hour < 13) {
            System.out.println("午睡 " + w.Hour);
        } else {
            w.transformState(new afternoon());
            w.goingState();
        }
    }
}

class afternoon implements state {
    public void setState(work w) {
        if (w.Hour < 17) {
            System.out.println("下午继续工作 " + w.Hour);
        } else {
            w.transformState(new evening());
            w.goingState();
        }
    }
}

class evening implements state {
    public void setState(work w) {
        if (w.finished == true) {
            w.transformState(new backing());
            w.goingState();
        } else {
            w.transformState(new keepWorking());
            w.goingState();
        }
    }
}

class backing implements state {
    public void setState(work w) {
        System.out.println("下班回家 " + w.Hour);
    }
}

class keepWorking implements state {
    public void setState(work w) {
        if (w.Hour < 21)
            System.out.println("继续加班 " + w.Hour);
        else {
            w.transformState(new tired());
            w.goingState();
        }
    }
}

class tired implements state {
    public void setState(work w) {
        System.out.println("困死在工作桌上 " + w.Hour);
    }
}

class work {
    int Hour;
    state currentState;
    boolean finished;

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

    public boolean getFinished() {
        return finished;
    }

    public void setFinished(boolean finished) {
        this.finished = finished;
    }

    work() {
        currentState = new morning();
    }

    public void transformState(state st) {
        currentState = st;
    }

    public void goingState() {
        currentState.setState(this);
    }

状态模式将原写在一个方法中的多个状态,拿出来分别写成一个类,在类中实现状态,如果不符合就会进入下一个状态类中进行判断,每一个类只负责管理一个状态,而且如果增加新的状态,我们只需新增一个状态类,并指明由哪个状态跳转到该状态就可以了。这样就消除了我们需要耗费更多精力写的冗杂的if判断语句了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值