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

本文介绍了如何在Java中使用状态模式实现FrequentFlyer类,根据飞行里程自动切换不同的会员状态(如非会员、普卡、金卡和银卡),并计算相应的奖励里程。
摘要由CSDN通过智能技术生成

在这里插入图片描述
在状态模式中,我们创建表示各种状态的对象和一个行为随着状态对象改变而改变的 context 对象

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("-----------------------------");
    }
}

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值