JAVA设计模式之状态模式

本文通过一个开发者成长的例子,详细介绍了状态模式的设计思想。包括环境角色、抽象状态角色和具体状态角色等核心概念,并提供了完整的Java代码实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

状态模式,从名字就能看出来是对状态的一些封装操作。

状态模式三个要素是:

  • 环境角色: 上下文(context),提供容器环境,持有抽象状态的接口引用,进而根据条件控制状态的变化。
  • 抽象状态角色: 定义接口以及行为。
  • 具体状态角色: 每一个具体状态类都实现了环境(Context)的一个状态所对应的行为。

对开发中经常需要来判断状态的业务逻辑,我们应该把其封装成状态的类,看看一个例子你就明白了,看状态模式是如何来实现“从开发渣渣到大神的过程的”(学习次数越多,实力越牛逼)。

首先开发人员的成长状态接口

public interface GrowState {
    //学习使我们进步
    public void study(String user, String record, StudyManager studyManager);
}

各种状态的实例类:

//渣渣类
public class zhazha implements GrowState {
    @Override
    public void study(String user, String record, StudyManager studyManager) {
        System.out.println("诶我天,你这个渣渣!");
    }
}
//入门类
public class accidence implements GrowState {

    @Override
    public void study(String user, String record, StudyManager studyManager) {
        System.out.println("还不错,你已经是入门级别的了!");
    }
}
//大师类
public class master implements GrowState {

    @Override
    public void study(String user, String record, StudyManager studyManager) {
        System.out.println("恭喜啊,你已经是大师级别的了!");
    }
}

学习控制类(容器类,相当于环境context类)

public class StudyManager {
    //状态对象
    private GrowState state;
    //记录user的成长记录
    private Map<String, String> studyRecord = new HashMap<>();
    //记录user的学习次数
    private Map<String, Integer> studyRecordCount = new HashMap<>();

    public Map<String, String> getStudyRecord() {
        return studyRecord;
    }

    public void study(String user, String studyRecord) {
        Integer oldValue = studyRecordCount.get(user);
        if(oldValue == null) {
            oldValue = 0;
        }
        oldValue += 1;
        studyRecordCount.put(user, oldValue);

        if(oldValue == 1) {
            //渣渣级别
            state = new zhazha();
        }
        else if (oldValue > 1 && oldValue < 5){
            //入门级别
            state = new accidence();
        }
        else if (oldValue > 5){
            state = new master();
        }
        //执行学习,面向接口的方式
        state.study(user, studyRecord, this);
    }
}

客户端执行测试类:

public class Client {
    public static void main(String[] args) {
        StudyManager studyManager = new StudyManager();
        for(int i=0; i<9; i++) {
            studyManager.study("me", "record");
        }
    }
}

执行结果:
这里写图片描述

参考于:《JAVA与模式》之状态模式

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值