软考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("-----------------------------");
    }
}
相关推荐
AOwhisky1 分钟前
Python 学习笔记(第三期)——流程控制核心知识点自测与详解
开发语言·笔记·python·学习·云原生·运维开发·流程控制
雪碧聊技术6 分钟前
为什么要学函数式编程?
java·函数式编程
aaPIXa62233 分钟前
C++ 用 13 条规则让模型写出安全现代 C++
java·c++·安全
逆向编程1 小时前
Socket异常连接自动清理方案
开发语言
2601_949817722 小时前
C++指针与引用深度精讲:底层原理、差异对比与高阶实战陷阱
java·jvm·c++
va学弟2 小时前
Java 网络通信编程(10):Channel 和 Selector
java·开发语言
爱吃提升2 小时前
MATLAB impulse函数脉冲响应完整实操教程
开发语言·matlab
小饕2 小时前
从 1080 Ti 到树莓派 4:Qwen2.5-0.5B Function Calling 端侧部署七步实战
开发语言·人工智能
小张小张爱学习2 小时前
Apache Dubbo 3 + Spring Boot 3 多模块 Maven 项目,演示基于 Zookeeper 注册中心的 RPC 调用
java·dubbo
糯米导航3 小时前
Rust + ONNX Runtime 构建生产级 AI 推理服务:从零到压测
开发语言·人工智能·rust