23种设计模式之状态模式

状态模式

定义:对有状态的对象,把复杂的“判断逻辑”提取到不同的状态对象中,允许状态对象在其内部状态发生改变时改变其行为。
环境 -> 抽象状态 具体状态设置环境 (你中有我,我中有你)
以学生成绩状态设计为例,不及格”“中等”和“优秀” 3 种状态,当学生的分数小于 60 分时为“不及格”状态,当分数大于等于 60 分且小于 90 分时为“中等”状态,当分数大于等于 90 分时为“优秀”状态。
代码如下:

public class StateTest {
    public static void main(String[] args) {
        Context context = new Context();
        System.out.println("学生成绩状态测试:");
        context.add(30);
        context.add(40);
        context.add(25);
        context.add(-15);
        context.add(-25);

    }
}

// 环境类
class Context {
    private ScoreState scoreState;

    public Context() {
        this.scoreState = new LowState(this);
    }

    public ScoreState getScoreState() {
        return scoreState;
    }

    public void setScoreState(ScoreState scoreState) {
        this.scoreState = scoreState;
    }

    public void add(int score) {
        scoreState.addScore(score);
    }
}

abstract class ScoreState {
    protected Context context;  //环境
    protected String stateName; //状态名
    protected int score; //分数

    public abstract void checkState(); //检查当前状态

    public void addScore(int x) {
        score += x;
        System.out.print("加上:" + x + "分,\t当前分数:" + score);
        checkState();
        System.out.println("分,\t当前状态:" + context.getScoreState().stateName);
    }

}

// 不及格
class LowState extends ScoreState {
    public LowState(Context context) {
        this.context = context;
        stateName = "不及格";
        score = 0;
    }

    public LowState(ScoreState scoreState) {
        context = scoreState.context;
        stateName = "不及格";
        score = scoreState.score;
    }

    @Override
    public void checkState() {
        if (score >= 90) {
            context.setScoreState(new HighState(this));
        } else if (score >= 60) {
            context.setScoreState(new MiddleState(this));
        }
    }
}

//具体状态类:中等
class MiddleState extends ScoreState {
    public MiddleState(ScoreState state) {
        context = state.context;
        stateName = "中等";
        score = state.score;
    }

    @Override
    public void checkState() {
        if (score < 60) {
            context.setScoreState(new LowState(this));
        } else if (score >= 90) {
            context.setScoreState(new HighState(this));
        }
    }
}

//具体状态类:优秀
class HighState extends ScoreState {
    public HighState(ScoreState state) {
        context = state.context;
        stateName = "优秀";
        score = state.score;
    }

    @Override
    public void checkState() {
        if (score < 60) {
            context.setScoreState(new LowState(this));
        } else if (score < 90) {
            context.setScoreState(new MiddleState(this));
        }
    }
}

在这里插入图片描述

参考资料:
1.http://c.biancheng.net/view/1402.html
代码地址:https://gitee.com/zhoujie1/design-mode-and-principle.git

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值