软考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("-----------------------------");
    }
}
相关推荐
郝学胜-神的一滴6 小时前
超越Spring的Summer(一): PackageScanner 类实现原理详解
java·服务器·开发语言·后端·spring·软件构建
摇滚侠6 小时前
Java,举例说明,函数式接口,函数式接口实现类,通过匿名内部类实现函数式接口,通过 Lambda 表达式实现函数式接口,演变的过程
java·开发语言·python
阿里嘎多学长6 小时前
2026-02-03 GitHub 热点项目精选
开发语言·程序员·github·代码托管
Tony Bai6 小时前
“Go 2,请不要发生!”:如果 Go 变成了“缝合怪”,你还会爱它吗?
开发语言·后端·golang
万物得其道者成6 小时前
阿里云 H5 一键登录接入实战:前后端完整实现
阿里云·云计算·状态模式
打工的小王6 小时前
java并发编程(七)ReentrantReadWriteLock
java·开发语言
lang201509286 小时前
Java并发革命:JSR-133深度解析
java·开发语言
禹凕6 小时前
Python编程——进阶知识(面向对象编程OOP)
开发语言·python
abluckyboy6 小时前
基于 Java Socket 实现多人聊天室系统(附完整源码)
java·开发语言
Re.不晚6 小时前
JAVA进阶之路——数据结构之线性表(顺序表、链表)
java·数据结构·链表