当前位置: 首页 > article >正文

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

在这里插入图片描述
在状态模式中,我们创建表示各种状态的对象和一个行为随着状态对象改变而改变的 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("-----------------------------");
    }
}

在这里插入图片描述


http://www.kler.cn/a/161700.html

相关文章:

  • 如何保护 Microsoft 网络免受中间人攻击
  • 【大数据学习 | flume】flume的概述与组件的介绍
  • 01:(手撸HAL+CubeMX)时钟篇
  • Spring高手之路26——全方位掌握事务监听器
  • 基于Java Web的传智播客crm企业管理系统的设计与实现
  • HarmonyOS的@State装饰器的底层实现
  • 【动手学深度学习】(十)PyTorch 神经网络基础+GPU
  • QT Windos平台下打包应用程序
  • CSM2433 一款集成2.4G+125K 和8位RISC 的SOC芯片
  • 临时或永久修改linux-kali虚拟机的主机名和遇见的错误解决方法(保姆级图文)【网络工程】
  • 流量分析1--菜刀666
  • [ES]ElasticSearch强转日期的时区问题
  • 备忘录怎么传到电脑?备忘录手机电脑互传方法
  • echarts图之 底部滚动横轴 缩放图形大小
  • 软件开发安全指南
  • IDEA 保存自动ESLint格式化
  • python 涉及opencv mediapipe知识,眨眼计数 供初学者参考
  • 【Linux】进程通信之命名管道mkfifo
  • 【设计模式-3.1】结构型——外观模式
  • GO设计模式——5、建造者模式(创建型)
  • 深眸科技以机器视觉高性能优势,为消费电子行业提供优质解决方案
  • vuepress路径问题,导致图片不显示
  • 十一.图像处理与光学之图像缩放方式
  • Course2-Week3-使用机器学习的建议
  • 【开源】基于Vue.js的二手车交易系统
  • 力扣102. 二叉树的层序遍历