软考2018下午第六题改编逻辑(状态模式)

在状态模式中,我们创建表示各种状态的对象和一个行为随着状态对象改变而改变的 context 对象

java 复制代码
package org.example.状态模式.软考航空;


/**
 * @author lst
 * @date 2023年12月07日 15:37
 */
class FrequentFlyer {
    CState state;
    double flyMiles;

    public FrequentFlyer() {
        state = new CNoCustomer();
        flyMiles = 0;
        setState(state);
    }

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

    public void travel(int miles) {
        double bonusMiles = state.travel(miles, this);
        flyMiles = flyMiles + bonusMiles;
    }
}

abstract class CState {
    public int flyMiles;//里程数

    public abstract double travel(int miles, FrequentFlyer context);
}

//非会员
class CNoCustomer extends CState {
    @Override
    public double travel(int miles, FrequentFlyer context) {
        System.out.println("Your travel will not account for points");
        return miles;
    }
}

//普卡会员
class CBasic extends CState {
    @Override
    public double travel(int miles, FrequentFlyer context) {
        context.flyMiles += miles; // 将里程数加入到总里程中判断是否升级会员
        if (context.flyMiles >= 25000 && context.flyMiles < 50000) {
            context.setState(new CSliver());
        }
        if (context.flyMiles >= 50000) {
            context.setState(new CGold());
        }
        context.flyMiles -= miles; // 将里程数恢复
        return miles;
    }
}

//金卡会员
class CGold extends CState {
    @Override
    public double travel(int miles, FrequentFlyer context) {
        context.flyMiles += miles; // 将里程数加入到总里程中判断是否升级会员
        if (context.flyMiles >= 25000 && context.flyMiles < 50000) {
            context.setState(new CSliver());
        }
        if (context.flyMiles < 25000) {
            context.setState(new CBasic());
        }
        context.flyMiles -= miles; // 将里程数恢复
        return miles + 0.5 * miles;
    }
}

class CSliver extends CState {
    @Override
    public double travel(int miles, FrequentFlyer context) {
        context.flyMiles += miles; // 将里程数加入到总里程中判断是否升级会员
        if (context.flyMiles < 25000) {
            context.setState(new CBasic());
        }
        if (context.flyMiles >= 50000) {
            context.setState(new CGold());
        }
        context.flyMiles -= miles; // 将里程数恢复
        return miles + 0.25 * miles;
    }
}

class Main {
    public static void main(String[] args) {
        // 创建一个 FrequentFlyer 实例,测试银会员50000里程,应该给多少里程
        FrequentFlyer frequentFlyer = new FrequentFlyer();
        //本身银会员
        frequentFlyer.setState(new CSliver());
        //本年度清零
//        frequentFlyer.flyMiles=0;
        //本年度初始值
        frequentFlyer.flyMiles=25000;
        //新增里程数
        frequentFlyer.travel(25000);
        displayStatus(frequentFlyer);
    }

    // 显示 FrequentFlyer 的会员状态和飞行里程
    private static void displayStatus(FrequentFlyer frequentFlyer) {
        System.out.println("Current Member Status: " + frequentFlyer.state.getClass().getSimpleName());
        System.out.println("Current Fly Miles: " + frequentFlyer.flyMiles);
        System.out.println("-----------------------------");
    }
}
相关推荐
SeaDhdhdhdhdh3 小时前
MCP Server 搭建与使用指南
java·ai·agent·mcp
李妍.3 小时前
02Numpy基础(上)
开发语言·python
TheBestRucy3 小时前
Python 九阳神功之贰:面向对象(下)
开发语言·python
YH55269843 小时前
GPT‑5.6 Sol 原本支持 1M 上下文,Codex 现已放开此前限制,如何看待这次调整?
java·jvm·人工智能·gpt·算法·chatgpt
AI_小站4 小时前
刚面完百度的 Agent 开发岗,我才发现:世界就是个巨大的草台班子
java·开发语言·人工智能·spring·百度·langchain
许彰午4 小时前
03-三种开发模式
java·架构
felixking5 小时前
C++20 协程
开发语言·c++·协程
涟漪海洋5 小时前
创建最新的JDK25镜像,非root环境启动
java
Rain的Java大神之路5 小时前
短信接口被狂刷怎么处理
java·运维·后端·web安全·面试·架构·xss
2602_959960926 小时前
谢飞机面试大厂:Spring Boot、JVM、Redis、Kafka、微服务与音视频搜索场景求生实录
java·jvm·spring boot·redis·面试题