设计模式-13.状态模式

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

使用场景:1.当控制一个对象状态转换条件表达式过于复杂的情况,把状态的判断逻辑转移到表示不同状态的一系列类当中,可以把复杂的判断逻辑简化。2.当一个对象的行为取决于它的状态,并且它必须在运行时刻根据状态改变它的行为时,就可以考虑状态模式了

实现:定义状态接口以及若干个状态实现类,接口定义一个设置状态方法。定义Context类,维护一个状态实现类示例

优点:消除庞大的条件分支语句,将各个状态转移逻辑分布到State的子类之间,来减少相互依赖

缺点:状态模式对"开闭原则"的支持并不太好,对于可以切换状态的状态模式,增加新的状态类需要修改那些负责状态转换的源代码,否则无法切换到新增状态,而且修改某个状态类的行为也需修改对应类的源代码。

代码示例:模拟一天不同时间员工的工作状态

/**
 * 状态接口
 * @author liuhao
 *
 */
public interface State {
    void handle(Work work);
}

/**
 * 上午状态
 * @author liuhao
 *
 */
public class ForenoonState implements State{

    @Override
    public void handle(Work work) {
        if (work.getTime() < 12) {
            System.out.println("当前时间:" + work.getTime() + " 上午,精力充沛,工作效率高!!!");
        }else {
            System.out.println("###进入中午状态###");
            work.setState(new NoonState());
        }
    }

}

/**
 * 中午状态
 * @author liuhao
 *
 */
public class NoonState implements State {

    @Override
    public void handle(Work work) {
        if (work.getTime() < 14) {
            System.out.println("当前时间:" + work.getTime() + " 中午休息!!!");
        }else {
            System.out.println("###进入下午状态###");
            work.setState(new AfterNoonState());
        }
    }

}

/**
 * 下午状态
 * @author liuhao
 *
 */
public class AfterNoonState implements State {

    @Override
    public void handle(Work work) {
        if (work.getTime() < 18) {
            System.out.println("当前时间:" + work.getTime() + " 下午犯困,工作质量下降!!!");
        }else {
            System.out.println("###进入下班状态###");
            work.setState(new RestState());
        }
    }

}

/**
 * 下班状态
 * @author liuhao
 *
 */
public class RestState implements State {

    @Override
    public void handle(Work work) {
        System.out.println("当前时间:" + work.getTime() + " 下班休息,满血复活!!!");
    }

}

/**
 * 工作类
 * @author liuhao
 *
 */
public class Work {
    private State state;

    private int time;

    public Work() {
        this.state = new ForenoonState();;
    }
    
    public void request() {
        state.handle(this);
    }
    
    public int getTime() {
        return time;
    }

    public void setTime(int time) {
        this.time = time;
    }
    
    public State getState() {
        return state;
    }

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

public class Main {

    public static void main(String[] args) {
        Work work = new Work();
        work.setTime(9);
        work.request();
        
        work.setTime(12);
        work.request();
        
        work.setTime(13);
        work.request();
        
        work.setTime(15);
        work.request();
        
        work.setTime(16);
        work.request();
        
        work.setTime(19);
        work.request();
        
        work.setTime(20);
        work.request();
    }

}
结果:

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值